Navigation과 Avoidance
대규모 에이전트의 경로 탐색과 충돌 회피 시스템을 이해합니다
MassNavigation 개요
Mass Entity 전용 내비게이션 시스템
기존 UE5 NavMesh는 개별 에이전트 단위로 경로를 계산하여 대규모에 부적합합니다. MassNavigation은 ZoneGraph 기반으로 수천 에이전트를 효율적으로 이동시킵니다.
| 비교 | NavMesh + AIMoveTo | MassNavigation |
|---|---|---|
| 데이터 구조 | NavMesh (폴리곤) | ZoneGraph (레인/노드) |
| 경로 계산 | A* 개별 탐색 | 레인 기반 배치 이동 |
| 회피 | RVO / Detour | Force 기반 회피 |
| 확장성 | ~100 에이전트 | 10,000+ 에이전트 |
// 내비게이션 관련 핵심 Fragment들
//
// FMassMoveTargetFragment
// - Center: 이동 목표 위치
// - DesiredSpeed: 목표 속도
// - IntentAtGoal: 도착 시 행동 (Stand, Move)
// - CurrentAction: 현재 행동 상태
//
// FMassNavigationFragment
// - 현재 경로 정보, 레인 참조
//
// FMassVelocityFragment
// - LinearVelocity: 현재 속도 벡터
//
// FMassForceFragment
// - SteeringForce: 조향 힘
// - AvoidanceForce: 회피 힘
// - EnvironmentForce: 환경 제약 힘
ZoneGraph는 도로, 인도, 경로를 레인(Lane)과 노드(Node)로 정의합니다. City Sample에서 보행자는 인도 레인을, 차량은 도로 레인을 따라 이동합니다. NavMesh보다 구조화된 이동 패턴에 적합합니다.
Movement 파이프라인
이동 처리의 전체 흐름
// 매 프레임 이동 처리 순서
//
// 1. StateTree → MoveTarget 설정
// FMassMoveTargetFragment.Center = 목표 위치
// ↓
// 2. Steering Processor → 조향 힘 계산
// 현재 위치에서 목표까지의 방향 + 속도 계산
// FMassForceFragment.SteeringForce = 계산된 힘
// ↓
// 3. Avoidance Processor → 회피 힘 계산
// 주변 에이전트/장애물과의 충돌 예측
// FMassForceFragment.AvoidanceForce = 회피 힘
// ↓
// 4. Force Combination → 최종 힘 합산
// SteeringForce + AvoidanceForce + EnvironmentForce
// ↓
// 5. Velocity Update → 속도 업데이트
// FMassVelocityFragment.LinearVelocity = 최종 속도
// ↓
// 6. Position Update → 위치 업데이트
// FTransformFragment += Velocity * DeltaTime
void USimpleMovementProcessor::Execute(
FMassEntityManager& EntityManager,
FMassExecutionContext& Context)
{
MoveQuery.ForEachEntityChunk(EntityManager, Context,
[](FMassExecutionContext& Ctx)
{
auto Transforms =
Ctx.GetMutableFragmentView<FTransformFragment>();
auto MoveTargets =
Ctx.GetMutableFragmentView<FMassMoveTargetFragment>();
auto Velocities =
Ctx.GetMutableFragmentView<FMassVelocityFragment>();
const float DT = Ctx.GetDeltaTimeSeconds();
for (int32 i = 0; i < Ctx.GetNumEntities(); ++i)
{
FVector CurrentPos =
Transforms[i].Transform.GetLocation();
FVector TargetPos = MoveTargets[i].Center;
FVector Direction = (TargetPos - CurrentPos);
float Dist = Direction.Size();
if (Dist > 50.0f) // 도착 판정
{
Direction.Normalize();
float Speed = MoveTargets[i].DesiredSpeed.Get();
Velocities[i].Value = Direction * Speed;
Transforms[i].Transform.AddToTranslation(
Velocities[i].Value * DT);
}
else
{
Velocities[i].Value = FVector::ZeroVector;
MoveTargets[i].SetCurrentAction(
EMassMovementAction::Stand);
}
}
});
}
MassAvoidance
Force 기반 충돌 회피 시스템
MassAvoidance는 에이전트 간 충돌을 방지하기 위해 Force(힘) 기반 접근법을 사용합니다. 각 에이전트가 주변 에이전트에 대해 반발력을 계산합니다.
// Force 기반 충돌 회피
//
// ← 반발력 반발력 →
// [Agent A] ←───→ [Agent B]
// ↑ ↑
// │ 반발력 │ 반발력
// ↓ ↓
// [Agent C] [Wall]
//
// 각 에이전트의 최종 이동 방향 =
// 조향 힘 + SUM(모든 반발력) + 환경 제약
//
// 반발력 크기 = f(거리) → 가까울수록 강함
// 반발력 방향 = 상대 에이전트로부터 멀어지는 방향
주변 에이전트 탐색은 O(n^2) 복잡도를 가집니다. MassAvoidance는 공간 분할(Spatial Hashing)로 탐색 범위를 제한하지만, 에이전트 밀도가 높으면 여전히 비용이 큽니다. Simulation LOD로 먼 에이전트의 회피 계산을 줄이는 것이 중요합니다.
// MassEntityConfig에 Avoidance 추가
// ┌─────────────────────────────────────┐
// │ Traits: │
// │ UMassAvoidanceTrait │
// │ AvoidanceRadius: 50.0 │
// │ StandingAvoidanceRadius: 30.0 │
// │ AvoidanceForceMultiplier: 1.0 │
// └─────────────────────────────────────┘
실전 AI 파이프라인
City Sample 스타일의 완전한 AI 구성
// DA_SmartPedestrian - 보행자 AI Config
//
// Traits:
// [0] UMassVisualizationTrait → 시각화
// [1] UMassMovementTrait → 이동 데이터
// MaxSpeed: 200.0
// [2] UMassNavigationTrait → 경로 탐색
// [3] UMassAvoidanceTrait → 충돌 회피
// AvoidanceRadius: 50.0
// [4] UMassStateTreeTrait → AI 행동
// StateTree: ST_PedestrianAI
// [5] UMassSmartObjectTrait → 상호작용
// [6] UMassLODCollectorTrait → LOD 정보
// [7] UMassSimulationLODTrait → 시뮬레이션 LOD
//
// 결과 Archetype:
// Transform + Velocity + Force + MoveTarget +
// Navigation + Avoidance + StateTree + SmartObject +
// Representation + LOD + SimulationLOD
처음부터 모든 Trait를 추가하지 마세요. Transform + Movement만으로 시작하고, Navigation, Avoidance, StateTree를 하나씩 추가하며 테스트하세요. 문제 발생 시 원인 파악이 훨씬 쉬워집니다.
핵심 요약
- MassNavigation은 ZoneGraph 기반으로 수천 에이전트의 경로를 효율적으로 처리한다
- 이동 파이프라인: StateTree(목표) → Steering(방향) → Avoidance(회피) → Velocity → Position 순서이다
- MassAvoidance는 Force 기반 반발력으로 에이전트 간 충돌을 방지한다
- 공간 분할(Spatial Hashing)과 Simulation LOD로 회피 연산 비용을 관리한다
- 실전 AI Config는 Visualization, Movement, Navigation, Avoidance, StateTree, SmartObject, LOD Trait를 조합한다
- 구축은 점진적으로: 기본 이동부터 시작하여 기능을 하나씩 추가하며 테스트한다
도전 과제
배운 내용을 직접 실습해보세요
레벨에 ZoneGraph Shape(Spline 기반 경로)를 배치하고, Mass Entity가 ZoneGraph를 따라 이동하도록 MassNavigation Trait과 관련 Processor를 설정하세요.
MassAvoidance를 활성화하여 수백 개의 엔티티가 서로 충돌하지 않고 비켜가도록 하세요. Avoidance Radius, Look-ahead Distance 등의 파라미터를 조절하며 군중 행동을 관찰하세요.
ZoneGraph + StateTree + Avoidance를 결합하여 도시 환경에서 1000명 이상의 보행자가 도로를 따라 이동하고, 교차로에서 신호를 기다리며, 서로를 피해가는 완전한 군중 시뮬레이션을 구현하세요.