모름

04. enemies

이번에는 에너미를 다뤘습니다. 간단히 NavMesh를 이용하는 방법을 배웠습니다. 최종적으로 총알이 에너미를 감지함을 Debug.Log로 찍었습니다. 아래는 이번 강의 튜토리얼 중 좋았던 내용입니다.

 

private void CheckCollisions(float moveDistance)
{
    Ray ray = new Ray(transform.position, transform.forward);
    RaycastHit hit;
    if(Physics.Raycast(ray, out hit, moveDistance, collisionMask, QueryTriggerInteraction.Collide))
    {
        OnHitObject(hit);
    }
}

 

위 코드는 총알이 발사될 때 에너미를 감지하는 코드입니다. 총알 탐지로 OnTriggerEnter와 같은 함수를 써도 됐을텐데 여기선 레이를 발사하여 에너미를 감지합니다. 그 이유는 OnTriggerEnter의 경우, 총알이 프레임과 프레임 사이를 빠르게 통과하면 Trigger이벤트가 발생하지 않기 때문입니다.

 

또 처음보는 것은 QueryTriggerInteraction.Collide 입니다. 위 GIF파일을 보시면 알겠지만, Enemy 콜라이더의 IsTrigger는 체크된 상태입니다. 하지만 위 코드로 인해 레이에서 충돌을 감지해낼 수 있습니다.

 

IEnumerator UpdatePath()
{
    float refreshRate = .25f;
    while(target != null)
    {
        Vector3 targetPosition = new Vector3(target.position.x, 0, target.position.z);
        pathfinder.SetDestination(targetPosition);
        yield return new WaitForSeconds(refreshRate);
    }
}

 

위 코드에선 UpdatePath()함수가 유용합니다. 에너미를 위해 NavMesh를 사용할 때 업데이트에서 매 순간 타겟을 향해 경로계산을 하지 않고 코루틴을 통해 0.25초에 한 번씩 경로계산을 해줍니다. 성능면에서 훨씬 좋은 방법입니다.