PART 4 · 강의 3/3

Navigation과 Avoidance

대규모 에이전트의 경로 탐색과 충돌 회피 시스템을 이해합니다

01

MassNavigation 개요

Mass Entity 전용 내비게이션 시스템

기존 UE5 NavMesh는 개별 에이전트 단위로 경로를 계산하여 대규모에 부적합합니다. MassNavigation은 ZoneGraph 기반으로 수천 에이전트를 효율적으로 이동시킵니다.

비교 NavMesh + AIMoveTo MassNavigation
데이터 구조 NavMesh (폴리곤) ZoneGraph (레인/노드)
경로 계산 A* 개별 탐색 레인 기반 배치 이동
회피 RVO / Detour Force 기반 회피
확장성 ~100 에이전트 10,000+ 에이전트
MassNavigation Fragment // 내비게이션 관련 핵심 Fragment들 // // FMassMoveTargetFragment // - Center: 이동 목표 위치 // - DesiredSpeed: 목표 속도 // - IntentAtGoal: 도착 시 행동 (Stand, Move) // - CurrentAction: 현재 행동 상태 // // FMassNavigationFragment // - 현재 경로 정보, 레인 참조 // // FMassVelocityFragment // - LinearVelocity: 현재 속도 벡터 // // FMassForceFragment // - SteeringForce: 조향 힘 // - AvoidanceForce: 회피 힘 // - EnvironmentForce: 환경 제약 힘
ZoneGraph

ZoneGraph는 도로, 인도, 경로를 레인(Lane)노드(Node)로 정의합니다. City Sample에서 보행자는 인도 레인을, 차량은 도로 레인을 따라 이동합니다. NavMesh보다 구조화된 이동 패턴에 적합합니다.

02

Movement 파이프라인

이동 처리의 전체 흐름

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
C++ - 커스텀 Movement Processor 예시 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); } } }); }
03

MassAvoidance

Force 기반 충돌 회피 시스템

MassAvoidance는 에이전트 간 충돌을 방지하기 위해 Force(힘) 기반 접근법을 사용합니다. 각 에이전트가 주변 에이전트에 대해 반발력을 계산합니다.

Avoidance 개념도 // Force 기반 충돌 회피 // // ← 반발력 반발력 → // [Agent A] ←───→ [Agent B] // ↑ ↑ // │ 반발력 │ 반발력 // ↓ ↓ // [Agent C] [Wall] // // 각 에이전트의 최종 이동 방향 = // 조향 힘 + SUM(모든 반발력) + 환경 제약 // // 반발력 크기 = f(거리) → 가까울수록 강함 // 반발력 방향 = 상대 에이전트로부터 멀어지는 방향
Avoidance 비용

주변 에이전트 탐색은 O(n^2) 복잡도를 가집니다. MassAvoidance는 공간 분할(Spatial Hashing)로 탐색 범위를 제한하지만, 에이전트 밀도가 높으면 여전히 비용이 큽니다. Simulation LOD로 먼 에이전트의 회피 계산을 줄이는 것이 중요합니다.

C++ - Avoidance Trait 설정 // MassEntityConfig에 Avoidance 추가 // ┌─────────────────────────────────────┐ // │ Traits: │ // │ UMassAvoidanceTrait │ // │ AvoidanceRadius: 50.0 │ // │ StandingAvoidanceRadius: 30.0 │ // │ AvoidanceForceMultiplier: 1.0 │ // └─────────────────────────────────────┘
04

실전 AI 파이프라인

City Sample 스타일의 완전한 AI 구성

완전한 AI Entity Config // 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를 하나씩 추가하며 테스트하세요. 문제 발생 시 원인 파악이 훨씬 쉬워집니다.

SUMMARY

핵심 요약

  • MassNavigation은 ZoneGraph 기반으로 수천 에이전트의 경로를 효율적으로 처리한다
  • 이동 파이프라인: StateTree(목표) → Steering(방향) → Avoidance(회피) → Velocity → Position 순서이다
  • MassAvoidance는 Force 기반 반발력으로 에이전트 간 충돌을 방지한다
  • 공간 분할(Spatial Hashing)과 Simulation LOD로 회피 연산 비용을 관리한다
  • 실전 AI Config는 Visualization, Movement, Navigation, Avoidance, StateTree, SmartObject, LOD Trait를 조합한다
  • 구축은 점진적으로: 기본 이동부터 시작하여 기능을 하나씩 추가하며 테스트한다
PRACTICE

도전 과제

배운 내용을 직접 실습해보세요

실습 1: ZoneGraph 경로 탐색

레벨에 ZoneGraph Shape(Spline 기반 경로)를 배치하고, Mass Entity가 ZoneGraph를 따라 이동하도록 MassNavigation Trait과 관련 Processor를 설정하세요.

실습 2: Avoidance 시스템 설정

MassAvoidance를 활성화하여 수백 개의 엔티티가 서로 충돌하지 않고 비켜가도록 하세요. Avoidance Radius, Look-ahead Distance 등의 파라미터를 조절하며 군중 행동을 관찰하세요.

심화 과제: 대규모 군중 시뮬레이션

ZoneGraph + StateTree + Avoidance를 결합하여 도시 환경에서 1000명 이상의 보행자가 도로를 따라 이동하고, 교차로에서 신호를 기다리며, 서로를 피해가는 완전한 군중 시뮬레이션을 구현하세요.