This document is about: QUANTUM 2
SWITCH TO

에이전트 회피

Quantum은 하이브리드 역속도 장애물이라고 불리는 충돌 회피 기술의 변형을 구현합니다. 숨겨진 상황을 엿볼 수 있는 기사는 다음과 같습니다상호 충돌 방지 및 비디오 게임용 내비게이션.

navmesh agent prototype
Quantum Agent Avoidance (please ignore the missing leg movement)

회피 에이전트 설정

시뮬레이션 구성을 열고 검토합니다: AvoidanceRange는 회피 시스템의 품질 및 성능 비용에 매우 중요합니다. 에이전트가 서로 영향을 주기 시작하는 범위를 정의합니다. 범위는 두 에이전트의 반지름 사이에서 측정됩니다.

MaxAvoidanceCandidates는 각 에이전트가 사용하는 최대 회피 후보 수를 정의합니다. 더 많은 후보들이 더 많은 메모리와 CPU 시간을 필요로 하지만 에이전트를 많이 사용할 때 품질도 향상됩니다. 먼저 숫자를 줄이고 얼마나 적은 수로 실제로 빠져나갈 수 있는지 보세요. 회피 품질이 높을수록 그리고 서로 만나는 에이전트 수가 많을수록 이 수치가 높아져야 합니다.

경로 측정기 및 스티어링 에이전트를 사용하고 싶지만 회피 기능을 사용하지 않으려면 EnableAvoidance을 끄세요. 이렇게 하면 회피 작업이 예약되지 않았기 때문에 성능이 최적화됩니다. SystemSetup.cs에서 NavigationSystem을 완전히 제거한 경우에는 필요하지 않습니다.

simulation config

회피 기능을 활성화하려면 NavMeshAvoidanceAgent 컴포넌트를 NavMeshPathfinder 그리고NavMeshSteeringAgent 컴포넌트가 이미 있는 엔티티에 추가하십시오.

그런 다음 NavMeshAgentConfig의 회피 섹션을 설정합니다.

AvoidanceType.None은 그 누구도 에이전트가 다른 사람을 피하지 않을 것이지만 다른 사람들은 그것을 피하게 될 것입니다. NavMeshAvoidanceObstacle 컴포넌트와 매우 유사합니다.

Priority는 유니티에서와 같이 작동합니다. 가장 중요 = 0. 가장 덜 중요 = 99입니다. 기본값 = 50입니다. 회피 시스템은 상호 작용에 의존하기 때문에 (누가 누구를 얼마나 피하는지) 회피 작업은 항상 에이전트들 사이에 분할됩니다. 우선순위가 높은 에이전트는 작업의 25%만 수행하지만 우선순위가 같은 에이전트는 작업을 50/50으로 나눕니다.

유니티 레이어를 사용하고 AvoidanceLayerAvoidanceMask를 설정하여 에이전트를 필터링합니다. 예를 들어 일부 에이전트는 Heroes 계층에, 다른 에이전트는 Minions 계층에 설정하며 히어로즈가 미니언즈를 무시하도록 마스크를 설정합니다.

경로 찾기 및 조향에 사용되는 것과 다른 Radius을 회피하기 위해 OverrideRadiusForAvoidance를 전환합니다.

코너를 돌거나 좁은 통로를 통과하기 위해 경유지를 따라가려고 노력하는 동안 회피 문제를 해결하는 것은 어려울 수 있습니다. 문제를 완화하고 에이전트가 서로 차단하는 쪽으로 시각적 중첩을 허용하려면 ReduceAvoidanceAtWaypoints를 전환합니다. 에이전트가 경유지에 가까워질 때 적용되는 회피는 줄어듭니다. ReduceAvoidanceFactor 값은 에이전트 반지름에 곱한 다음 회피 영향력이 감소되는 거리를 2차적으로 나타냅니다.

기즈모를 씬 뷰로 렌더링 하려면 DebugAvoidance를 전환합니다. 위쪽의 회피 에이전트는 오른쪽의 이동 에이전트와 왼쪽의 장애물을 피하고 있습니다. 빨간색 원뿔은 에이전트의 속도 장애물이고 녹색 선은 후보이며 마지막으로 흰색 점이 선택된 후보입니다. 정지된 객체의 VO가 잘립니다(Navigation.Constants.VelocityObstacleTruncationFactor 참조).

avoidance agent debug gizmos

회피 장애물 설정

회피 장애물은 Navmesh 에이전트의 회피 행동에 영향을 미치지만 에이전트 자체는 아닙니다. NavMeshAvidanceAgent가 있는 엔티티에 NavMeshAvidanceObstacle 컴포넌트를 추가하면 assertion이 발생합니다.

NavMeshAvoidanceObstacle 컴포넌트를 사용하려면 Transform2/3D가 필요합니다.

NavMeshAvoidanceObstacle 컴포넌트가 있는 엔티티가 이동하는 경우 다른 에이전트는 미래의 위치를 예측하기 위해 해당 엔티티의 속도 정보를 요구합니다. 정기적으로 NavMeshAvoidanceObstacle.Velocity 속성을 업데이트해야 합니다.

회피 장애물을 설정합니다.

  • 유니티에서 EntityPrototype 컴포넌트로 다음을 수행합니다:
avoidance obstacle prototype
  • 또는 소스 코드에서 Quantum 컴포넌트로 사용:

C#

var c = f.Create();
f.Set(c, new Transform2D { Position = position });
var obstacle = new NavMeshAvoidanceObstacle();
obstacle.AvoidanceLayer = 0;
obstacle.Radius = FP._0_50;
obstacle.Velocity = FPVector2.Up;
f.Set(c, obstacle);

지터링 에이전트

여러 에이전트가 서로 다른 방향으로 이동하여 회피를 해결하면 에이전트가 좋은 경로를 찾을 때까지 목표 방향을 매우 빠르게 전환할 수 있습니다. 이를 완화하기 위해 에이전트의 Angular Speed를 조정하거나 이와 같이 EntityView를 재정의하여 뷰에 추가 스무딩을 적용할 수 있습니다. 이 블렌딩 수학은 단지 하나의 제안일 뿐입니다.

C#

using UnityEngine;

public class SmoothRotationEntityView : EntityView {
  private Quaternion rotation;
  public float Blending;

  protected override void ApplyTransform(ref UpdatePostionParameter param) {
    // Override this in subclass to change how the new position is applied to the transform.
    transform.position = param.NewPosition + param.ErrorVisualVector;

    // Unity's quaternion multiplication is equivalent to applying rhs then lhs (despite their doc saying the opposite)
    rotation = param.ErrorVisualQuaternion * param.NewRotation;
    transform.rotation = Quaternion.Lerp(transform.rotation, rotation, Time.deltaTime * Blending);
  }
}
Back to top