Version: 2020.2
추가 로딩을 사용하여 여러 내비메시 로드
내비메시 에이전트

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

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

내비메시 에이전트 및 물리

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

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

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

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

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

내비메시 장애물 및 물리

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