Programing/Unity(C#)

[Unity] 8방향으로 탄환을 발사하는 개체

hye3193 2024. 4. 12. 15:45
private IEnumerator coShootAttack()
{
    ShootAttack();
    yield return waitAfterShoot;
    State = Define.EnemyState.Idle;
    isAttacking = false;
}

private Vector2 ThetaToVector(float theta)
{
    Vector2 v;
    v.x = Mathf.Cos(Mathf.PI / 180 * theta);
    v.y = Mathf.Sin(Mathf.PI / 180 * theta);
    return v;
}

private void ShootAttack()
{
    for (int i = 0; i < 360; i += 45)
    {
        GameObject go = Instantiate(_bulletPrefab, transform.position, Quaternion.Euler(0, 0, i));
        go.GetComponent<EnemyBullet>().SetDir(ThetaToVector(i));
    }
}

공격을 발사하는 부분이다

원래 8방향으로 탄막을 발사하는 부분에 있어서 45도 각도로 발사하면 되기에 위와 같이 코드를 작성했는데, 각도를 방향벡터로 변경하는 방법을 모르겠어 일일이 Vector2 상수들을 지정했었다

 

그러다 게임 매니악스 슈팅 게임 알고리즘에 나온, 각도를 인자로 벡터를 반환하는 함수를 보게 되었고, 해당 방법을 이용하여 각도를 벡터로 바꾸는 코드를 작성하였다

 

public class EnemyBullet : MonoBehaviour
{
    private float moveSpeed = 6.0f;
    private int _power = 10;
    private Rigidbody2D rb;

    private void Init()
    {
        rb = GetComponent<Rigidbody2D>();
    }

    public void SetDir(Vector2 dir)
    {
        Init();
        rb.velocity = dir.normalized * moveSpeed;
        StartCoroutine(DestroyBullet());
    }

    private IEnumerator DestroyBullet()
    {
        yield return new WaitForSecondsRealtime(5.0f);
        Destroy(gameObject);
    }

    private void OnTriggerEnter2D(Collider2D other)
    {
        if (other.CompareTag("Player"))
        {
            other.GetComponent<PlayerController>().Damaged(_power);
            Destroy(gameObject);
        }
        if (other.CompareTag("Floor"))
            Destroy(gameObject);
    }
}

탄환의 클래스이다

원래는 Init 부분을 Start 함수에 넣었었는데, 인스턴스화 되자마자 날아가야 하는 총알 특성상 그냥 총 스크립트에서 방향설정과 동시에 초기화시킬 수 있도록 작성하였다

플레이어나 바닥에 닿으면 사라지도록 trigger 함수를 사용하였다