박민혁의 개발

유니티 유도 미사일 본문

TIL

유니티 유도 미사일

박민혁_kog 2023. 12. 19. 16:24
public class HumanAttackintelligentmissile : MonoBehaviour
{
    bool targeting;
    GameObject target;
    Bullet _bullet;
    private float turningForce;
    public bool ready;
    int targetName;

    public void init(int i) 
    {
        if (i == 1)
        {
            targeting = false;
            _bullet = GetComponentInParent<Bullet>();
            turningForce = 15f;
            targetName = 7;
            ready= true;
        }
        else
        {
            transform.localScale = new Vector3(5,5,0);
            targeting = false;
            _bullet = GetComponentInParent<Bullet>();
            turningForce = 7f;
            targetName = 8;
            ready = true;
        }
    }

    // Update is called once per frame
    void Update()
    {
        if (targeting) 
        {
            if (target == null) { return; }
            Vector2 dir = (target.transform.position - transform.position).normalized;
            _bullet.gameObject.transform.right = Vector3.Slerp(_bullet.gameObject.transform.right.normalized, dir, turningForce * Time.deltaTime);
        }
    }
    private void OnTriggerEnter2D(Collider2D collision)
    {
        if (ready &&!targeting && collision.gameObject.layer == targetName) 
            //TODO 먼훗날 팀킬 패치 하기
        {
            targeting = true;
            target= collision.gameObject;
        }
    }
}

코드의 풀버전이지만 사실 포인트는 아래

 

        if (targeting) 
        {
            if (target == null) { return; }
            Vector2 dir = (target.transform.position - transform.position).normalized;
            _bullet.gameObject.transform.right = Vector3.Slerp(_bullet.gameObject.transform.right.normalized, dir, turningForce * Time.deltaTime);
        }

타겟이 있다면 현재 트랜스폼의 오른쪽(2d환경, 오른쪽이 앞인 스프라이트를 가진 물체임)

을 현재 방향과 타겟 방향을 보간 처리 해준다 (안할시 너무 급작스럽게 변화함)

업데이트에서 돌리기 때문에 time.deltaTime 까지

 

현재 이코드는 젤 처음 만나는 대상을 타겟팅 하지만

좀더 변형 시킨다면 실시간으로 가까운 타겟을 업데이트에서도 돌리는 응용이 가능하다