추가 로딩을 사용하여 여러 내비메시 로드
네비메시 에이전트(NavMesh Agent)

내비메시 에이전트를 다른 컴포넌트와 함께 사용

내비메시 에이전트(NavMesh Agent), 내비메시 장애물(NavMesh Obstacle), 오프 메시 링크(Off Mesh Link) 컴포넌트는 다른 Unity 컴포넌트와 함께 사용할 수 있습니다. 다른 컴포넌트를 함께 사용할 때에는 다음과 같은 규칙을 따라야 합니다.

내비메시 에이전트 및 물리

  • 서로 충돌하지 않도록 내비메시 에이전트에 물리 콜라이더를 추가하지 않아도 됩니다.
    • 내비게이션 시스템이 에이전트뿐만 아니라 장애물과 정적 월드에 대한 에이전트의 반응까지 시뮬레이션하기 때문입니다. 여기서 정적 월드는 베이크된 내비메시입니다.
  • 내비메시 에이전트가 물리 오브젝트를 푸시하거나 물리 트리거를 사용하도록 하려면 다음과 같이 수행해야 합니다.
    • 콜라이더 컴포넌트를 추가합니다(없을 경우).
    • 리지드바디 컴포넌트를 추가합니다.
      • 키네마틱(물리 법칙에 영향을 받지 않음)을 활성화합니다. 이 작업은 매우 중요합니다!
      • 키네마틱이란 리지드바디가 물리 시뮬레이션 이외의 다른 요소에 의해 제어된다는 뜻입니다.
  • 내비메시 에이전트와 리지드바디(키네마틱이 아님)를 동시에 활성화하면 경합 조건이 발생합니다.
    • 두 컴포넌트가 동시에 에이전트를 움직이려고 하여 정의되지 않은 동작이 발생할 수 있습니다.
  • 내비메시 에이전트를 사용하여 물리 없이 플레이어 캐릭터 등을 움직일 수 있습니다.
    • 플레이어 에이전트의 회피 우선 순위를 작은 숫자(우선 순위가 높음)로 설정하여 플레이어가 군중 사이를 헤치고 지나갈 수 있게 합니다.
    • 다른 에이전트가 플레이어의 움직임을 예측하여 회피할 수 있도록 NavMeshAgent.velocity를 통해 플레이어 에이전트를 움직입니다.

내비메시 에이전트 및 애니메이터

  • 내비메시 에이전트와 루트 모션이 있는 애니메이터는 경합 조건을 유발할 수 있습니다.
    • 두 컴포넌트가 각 프레임에서 트랜스폼을 이동시키려고 합니다.
    • 두 가지 해결 방법
  • 정보는 항상 한 방향으로 흘러야 합니다.
    • 에이전트가 캐릭터를 움직이고 애니메이션이 이를 따르거나,
    • 시뮬레이션 결과에 기반하여 애니메이션이 캐릭터를 움직여야 합니다.
    • 그렇지 않으면 피드백 루프를 디버그하기가 어려워집니다.
  • 애니메이션이 에이전트를 따르는 경우 NavMeshAgent.velocity를 애니메이터의 입력값으로 사용하면 에이전트의 이동과 애니메이션이 대략적으로 일치합니다.
    • 확실하고 손쉬운 방법이지만, 애니메이션이 속도를 따라가지 못하면 발이 미끄러지는 결과가 나타날 수 있습니다.
  • 에이전트가 애니메이션을 따르는 경우

내비메시 에이전트 및 내비메시 장애물

  • 혼합해서는 안 됩니다!
    • 둘 다 활성화하면 에이전트가 스스로 회피하게 됩니다.
    • 추가적으로 카빙이 활성화된 경우 에이전트는 카빙된 구멍의 가장자리로 지속적으로 다시 매핑하려고 하여 더 잘못된 동작이 발생합니다.
  • 언제든지 둘 중 하나만 활성화되도록 합니다.
    • 멈춘 상태라면 에이전트를 끄고 장애물을 활성화하여 다른 에이전트가 이를 피하도록 합니다.
    • 또는 우선 순위를 설정하여 특정 에이전트를 더 회피하도록 할 수도 있습니다.

내비메시 장애물 및 물리

  • 물리 제어되는 오브젝트가 내비메시 에이전트의 동작에 영향을 주도록 하려면 다음과 같이 수행해야 합니다.
    • 에이전트가 인지해야 하는 오브젝트에 내비메시 장애물 컴포넌트를 추가합니다. 이렇게 하면 회피 시스템이 장애물을 추론할 수 있습니다.
  • 게임 오브젝트에 리지드바디와 내비메시 장애물이 추가된 경우 장애물의 속도는 자동으로 리지드바디에서 구해집니다.
    • 이렇게 하면 내비메시 에이전트가 움직이는 장애물을 예측하고 회피할 수 있습니다.
추가 로딩을 사용하여 여러 내비메시 로드
네비메시 에이전트(NavMesh Agent)