공부/Unity

Navigation, NavMesh Agent, 타겟 탐색

월러비 2025. 8. 28. 17:24
  • Equals 함수는 값형식을 오브젝트형으로 반환하기 때문에 박싱 언박싱이 일어난다.
    • 때문에, EqualityComparer 함수를 써라
  • LinkedList
    • 인덱서를 이용한 접근이 불가능하다.
    • 요소를 앞 또는 뒤로 추가한다.
    • 시작 노드의 ‘참조’만 가지고 있어야한다.
    • 헤드 노드는 null 상태다.
    • 뒤에 추가 : 링크드 리스트 노드를 만들어야한다.
      • 2개의 필드가 필요하다.
        • value : 값이 들어가야한다.
        • 다음 노드의 레퍼런트 : 링크드 리스트의 인스턴스

Navigation

  • 원격으로 움직일 수 있는 영역을 네비게이션 메쉬로 설정하는 것이다.
  • NavMesh Surface : NavMesh-NavMesh Surface가 생성된다.
    • NavMesh가 설정된다.
    • NavMesh : 길찾기에 필요한 데이터가 설정되는 영역이다.
  • NavMesh Data는 기본적으로 ‘움직이지 않는’ 오브젝트를 대상으로 생성된다.
  • Navigation의 단차
    • 높낮이가 있는 곳 둘다 네이게이션 메쉬가 설정되어있고, 돌아서 이동해야하지만 단차 높이 설정을 하거나 추가 설정을 하면 이동이 가능해진다.
    • AgentTypes를 따로 설정한다면 각 개체별로 단차를 다르게 줄 수 있다.
     

Nav Mesh Agent

  • Stopping Distance : 목표지점까지 이동하던 중 Stopping Distance까지 도달하면 도착했다고 멈추는 서리 옵션이다.
  • Obstacle Avoidance : 장애물을 피하는 콜라이더 설정

타겟 탐색

  1. Trigger로 일정 영역을 전부 검사해서 특정 tag를 찾는다.
  2. 유니티에서 제공하는 중심과 반경을 탐색해주는 기능이 있다.
    1. 광역 공격에서 범위 타격을 위해 사용하는 경우가 있다.
public LayerMask targetLayer;

protected Transform FindTarget(float radius)
{
    var colliders = Physics.OverlapSphere(transform.position, radius, targetLayer.value);
    if(colliders.Length == 0)
    {
        return null;
    }

    //OrderBy : 들어온 값 기준으로 오름차순 정렬 / 중에 첫번쨰니까 가장 가까운 플레이어가 탐색된다.
    var target = colliders.OrderBy(x => Vector3.Distance(x.transform.position, transform.position)).First();
    return target.transform;
}
  • tag와 Layer는 비슷하지만 다른 점이 있다.
    • Layer : 1 2 4 8 레이어를 비트를 이용해서 사용할 수 있다.
    • Camera에서도 Culling Mask를 통해서 해당 레이어만 렌더링을 필터링 할 수 있다.
      • Collider도 이게 가능하다.
if (target != null && Vector3.Distance(transform.position, target.position) < attackDistance)
{
    CurrentStatus = Status.Attack;
    return;
}
if (target == null || Vector3.Distance(transform.position, target.position) > traceDistance)
{
    CurrentStatus = Status.Idle;
    return;
}

agent.SetDestination(target.position);