언리얼 엔진의 AI ROV (RVO: Reciprocal Velocity Obstacles) 기능은 AI 에이전트들 사이의 충돌을 피하기 위한 이동 알고리즘입니다. 즉, 여러 AI 캐릭터가 동시에 움직일 때 서로 충돌하지 않고 자연스럽게 경로를 회피하도록 만들어주는 기능입니다. 이 기능은 특히 군중 시뮬레이션, RTS, MOBA 장르에서 자주 사용됩니다.


RVO (Reciprocal Velocity Obstacles) 개념

  • 목적: AI가 다른 AI 또는 장애물과 충돌하지 않도록 경로를 조절함.
  • 기반 원리: 다른 에이전트의 속도를 예측해 충돌 가능성이 있는 경우, 서로의 속도를 적절히 조절해 충돌을 피함.
  • Reciprocal의 의미: 단방향 회피가 아니라 쌍방 간 양보/회피.

언리얼 엔진에서의 적용 방식

언리얼 엔진에서는 UCrowdFollowingComponent를 통해 RVO가 지원됩니다.
NavMesh를 기반으로 이동하되, AI 간 충돌을 회피하도록 설정할 수 있습니다.

1. 사용 전제 조건

  • NavMeshBoundsVolume이 제대로 설정되어 있어야 함
  • AIController의 MovementComponent가 UCrowdFollowingComponent 여야 함
// AIController 생성자에서 설정 예시
AAIControllerWithRVO::AAIControllerWithRVO()
{
    CrowdFollowingComponent = CreateDefaultSubobject<UCrowdFollowingComponent>(TEXT("CrowdFollowingComponent"));
    SetMoveBlockDetection(true);  // 옵션에 따라 설정
}

2. 캐릭터의 CharacterMovementComponent 설정

CharacterMovementComponent에서 아래 항목을 설정해야 합니다:

CharacterMovement->bUseRVOAvoidance = true;           // RVO 회피 기능 사용
CharacterMovement->AvoidanceWeight = 0.5f;            // 회피 우선순위 (0.0~1.0)
CharacterMovement->AvoidanceConsiderationRadius = 500.f;  // 고려 반경
CharacterMovement->AvoidanceGroup.SetGroup(1);        // 회피 그룹 설정 (비트마스크)

3. Avoidance Priority (우선순위)

  • AvoidanceWeight와 함께 사용하는 값.
  • AI가 서로 충돌할 경우, 우선순위가 높은 쪽이 덜 피하고, 낮은 쪽이 더 피함.
CharacterMovement->SetAvoidancePriority(10);  // 낮을수록 먼저 피함

4. Editor 상에서도 설정 가능

  • CharacterMovementComponent → Avoidance 카테고리에서 설정 가능
  • Use RVO Avoidance 체크박스
  • Avoidance Weight, Avoidance Priority 수치 입력

5. 디버깅

  • ShowDebug crowd 콘솔 명령어로 군중 및 RVO 회피 동작 시각화 가능

요약

항목 설명
기능명 RVO (Reciprocal Velocity Obstacle)
목적 AI끼리 충돌하지 않고 자연스럽게 회피
관련 컴포넌트 UCrowdFollowingComponent, CharacterMovementComponent
주요 설정 bUseRVOAvoidance, AvoidanceWeight, AvoidancePriority
디버그 명령어 ShowDebug crowd
필수 요소 NavMesh, MovementComponent가 Crowd용으로 설정되어야 함