에이전트 회피
Quantum은 하이브리드 역속도 장애물이라고 불리는 충돌 회피 기술의 변형을 구현합니다. 숨겨진 상황을 엿볼 수 있는 기사는 다음과 같습니다상호 충돌 방지 및 비디오 게임용 내비게이션.
회피 에이전트 설정
시뮬레이션 구성을 열고 검토합니다: AvoidanceRange
는 회피 시스템의 품질 및 성능 비용에 매우 중요합니다. 에이전트가 서로 영향을 주기 시작하는 범위를 정의합니다. 범위는 두 에이전트의 반지름 사이에서 측정됩니다.
MaxAvoidanceCandidates
는 각 에이전트가 사용하는 최대 회피 후보 수를 정의합니다. 더 많은 후보들이 더 많은 메모리와 CPU 시간을 필요로 하지만 에이전트를 많이 사용할 때 품질도 향상됩니다. 먼저 숫자를 줄이고 얼마나 적은 수로 실제로 빠져나갈 수 있는지 보세요. 회피 품질이 높을수록 그리고 서로 만나는 에이전트 수가 많을수록 이 수치가 높아져야 합니다.
경로 측정기 및 스티어링 에이전트를 사용하고 싶지만 회피 기능을 사용하지 않으려면 EnableAvoidance
을 끄세요. 이렇게 하면 회피 작업이 예약되지 않았기 때문에 성능이 최적화됩니다. SystemSetup.cs
에서 NavigationSystem
을 완전히 제거한 경우에는 필요하지 않습니다.
회피 기능을 활성화하려면 NavMeshAvoidanceAgent
컴포넌트를 NavMeshPathfinder
그리고NavMeshSteeringAgent
컴포넌트가 이미 있는 엔티티에 추가하십시오.
그런 다음 NavMeshAgentConfig
의 회피 섹션을 설정합니다.
AvoidanceType.None
은 그 누구도 에이전트가 다른 사람을 피하지 않을 것이지만 다른 사람들은 그것을 피하게 될 것입니다. NavMeshAvoidanceObstacle
컴포넌트와 매우 유사합니다.
Priority
는 유니티에서와 같이 작동합니다. 가장 중요 = 0. 가장 덜 중요 = 99입니다. 기본값 = 50입니다. 회피 시스템은 상호 작용에 의존하기 때문에 (누가 누구를 얼마나 피하는지) 회피 작업은 항상 에이전트들 사이에 분할됩니다. 우선순위가 높은 에이전트는 작업의 25%만 수행하지만 우선순위가 같은 에이전트는 작업을 50/50으로 나눕니다.
유니티 레이어를 사용하고 AvoidanceLayer
및 AvoidanceMask
를 설정하여 에이전트를 필터링합니다. 예를 들어 일부 에이전트는 Heroes
계층에, 다른 에이전트는 Minions
계층에 설정하며 히어로즈가 미니언즈를 무시하도록 마스크를 설정합니다.
경로 찾기 및 조향에 사용되는 것과 다른 Radius
을 회피하기 위해 OverrideRadiusForAvoidance
를 전환합니다.
코너를 돌거나 좁은 통로를 통과하기 위해 경유지를 따라가려고 노력하는 동안 회피 문제를 해결하는 것은 어려울 수 있습니다. 문제를 완화하고 에이전트가 서로 차단하는 쪽으로 시각적 중첩을 허용하려면 ReduceAvoidanceAtWaypoints
를 전환합니다. 에이전트가 경유지에 가까워질 때 적용되는 회피는 줄어듭니다. ReduceAvoidanceFactor
값은 에이전트 반지름에 곱한 다음 회피 영향력이 감소되는 거리를 2차적으로 나타냅니다.
기즈모를 씬 뷰로 렌더링 하려면 DebugAvoidance
를 전환합니다. 위쪽의 회피 에이전트는 오른쪽의 이동 에이전트와 왼쪽의 장애물을 피하고 있습니다. 빨간색 원뿔은 에이전트의 속도 장애물이고 녹색 선은 후보이며 마지막으로 흰색 점이 선택된 후보입니다. 정지된 객체의 VO가 잘립니다(Navigation.Constants.VelocityObstacleTruncationFactor
참조).
회피 장애물 설정
회피 장애물
은 Navmesh 에이전트의 회피 행동에 영향을 미치지만 에이전트 자체는 아닙니다. NavMeshAvidanceAgent
가 있는 엔티티에 NavMeshAvidanceObstacle
컴포넌트를 추가하면 assertion이 발생합니다.
NavMeshAvoidanceObstacle
컴포넌트를 사용하려면 Transform2/3D
가 필요합니다.
NavMeshAvoidanceObstacle
컴포넌트가 있는 엔티티가 이동하는 경우 다른 에이전트는 미래의 위치를 예측하기 위해 해당 엔티티의 속도 정보를 요구합니다. 정기적으로 NavMeshAvoidanceObstacle.Velocity
속성을 업데이트해야 합니다.
회피 장애물을 설정합니다.
- 유니티에서 EntityPrototype 컴포넌트로 다음을 수행합니다:
- 또는 소스 코드에서 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