내비게이션 시스템으로 회피 사용하기

이 가이드에서는 내비게이션 시스템으로 회피를 사용하는 방법을 설명합니다.

Choose your operating system:

Windows

macOS

Linux

개요

언리얼 엔진내비게이션 시스템(Navigation System) 은 에이전트가 내비게이션 메시(Navigation Mesh) 를 사용하여 레벨 내에서 경로를 찾고 이동하도록 지원합니다.

경로 찾기(pathfinding)로는 움직이지 않는 오브젝트를 우회하는 경로를 결정할 수 있으며, 회피(avoidance) 알고리즘은 움직이는 장애물을 처리하는 데 보다 적합합니다. 에이전트가 동적인 장애물을 우회하는 데 사용할 수 있는 회피 메서드에는 역수 속도 장애물(Reciprocal Velocity Obstacles, RVO)크라우드 우회 매니저(Detour Crowd Manager) 가 있습니다.

역수 속도 장애물(RVO) 시스템은 각 에이전트의 속도 벡터를 계산하여 인근 에이전트와의 콜리전을 피합니다. 이 시스템은 인근 에이전트를 확인하여 에이전트가 계산이 이루어지는 각 시간 단위 내에 일정한 속도로 움직인다고 가정합니다. 선택되는 최적의 속도 벡터는 에이전트의 타깃 방향 선호 속도에 가장 가까운 결과입니다.

언리얼 엔진의 RVO 구현에는 프레임 레이트 종속성을 줄이기 위한 최적화가 포함됩니다. 경로를 지속적으로 다시 계산하지 않기 위한 개선 사항과 잠재적인 콜리전을 해결하기 위한 우선순위 시스템도 포함됩니다. RVO는 회피에 내비게이션 메시를 사용하지 않으므로 어느 캐릭터에서나 내비게이션 시스템과 별도로 사용할 수 있습니다. 이 시스템은 캐릭터 클래스의 캐릭터 무브먼트(Character Movement) 컴포넌트에 포함되어 있습니다.

크라우드 우회 매니저(Detour Crowd Manager) 시스템은 적응형 RVO 샘플링 계산을 사용하여 에이전트 간 회피를 처리합니다. 이를 위해 에이전트 방향으로 바이어스가 부여된 거친 속도 샘플을 계산하므로 기존 RVO 메서드보다 회피 퀄리티가 크게 향상됩니다. 또한 이 시스템은 비저빌리티 및 토폴로지 경로 최적화를 사용하여 콜리전 회피를 한층 개선합니다.

크라우드 우회 매니저 시스템은 샘플링 패턴, 최대 에이전트 수, 에이전트 반경을 지정하는 옵션을 통해 다양한 환경설정이 가능합니다. 시스템은 DetourCrowd AI 컨트롤러(DetourCrowd AI Controller) 클래스에 포함되며, 어떤 폰 클래스와도 사용할 수 있습니다.

두 시스템은 개별적으로 작동하므로 프로젝트에서는 둘 중 하나만 사용해야 합니다.

회피 메서드 요약 비교

메서드

설명

한계

RVO

  • 에이전트가 지정된 반경 내에서 속도 벡터를 사용하여 장애물을 회피합니다.

  • 캐릭터 클래스의 캐릭터 무브먼트 컴포넌트에 포함되어 있습니다.

  • 크라우드 우회 매니저에 비해 환경설정 가능한 부분이 적습니다.

  • 캐릭터 클래스에 제한됩니다.

  • 회피에 내비게이션 메시를 사용하지 않아서 에이전트가 '경계 밖'으로 나갈 수 있습니다.

크라우드 우회 매니저

  • 에이전트가 지정된 반경 내에서 경로 최적화를 속도 벡터와 함께 사용하여 장애물을 회피합니다.

  • DetourCrowd AI 컨트롤러 클래스에 포함되어 있습니다. | 프로젝트 세팅에서 최대 에이전트 수가 고정됩니다.

  • 프로젝트 세팅에서 최대 에이전트 수가 고정됩니다.

목표

이 가이드에서는 상호작용하는 여러 에이전트의 행동을 비교하며 RVO(Reciprocal Velocity Obstacles) 및 크라우드 우회(Detour Croud) 회피 메서드를 사용하는 방법을 알아봅니다.

세부 목표

  • 타깃을 향해 이동하도록 ThirdPersonCharacter 블루프린트를 수정합니다.

  • RVO 회피를 사용하도록 에이전트 블루프린트를 수정합니다.

  • 크라우드 우회 회피를 사용하도록 에이전트 블루프린트를 수정합니다.

1 - 필수 구성

  1. 언리얼 프로젝트 브라우저(Unreal Project Browser)의 새 프로젝트 카테고리(New Project Categories) 섹션에서 게임(Games) > 삼인칭(Third Person) 템플릿을 선택합니다.

    게임 카테고리를 선택하고 다음을 클릭합니다

  2. 블루프린트(Blueprint)시작용 콘텐츠 없음(No Starter Content) 옵션을 선택한 뒤 생성(Create) 을 클릭합니다.

    블루프린트와 시작용 콘텐츠 없음 옵션을 선택한 뒤 프로젝트 생성을 클릭합니다

섹션 결과

새 삼인칭 프로젝트를 생성했다면 이제 언리얼 엔진에서 사용 가능한 회피 메서드를 배울 준비가 된 것입니다.

2 - 테스트 레벨 만들기

  1. 메뉴 바에서 파일(File) > 새 레벨(New Level) 을 클릭합니다.

    새 레벨을 클릭합니다

  2. Default 레벨을 선택합니다.

    Default 레벨을 선택합니다

  3. 아웃라이너(Outliner) 에서 Floor 스태틱 메시 액터(Static Mesh Actor)를 선택하고 디테일(Details) 패널에서 스케일(Scale) 을 X = 10, Y = 10, Z = 1로 설정합니다.

    월드 아웃라이너에서 Floor 스태틱 메시 액터를 선택합니다

    스케일을 X = 10, Y = 10, Z = 1로 설정합니다

  4. 액터 배치(Place Actors) 패널에서 NavMeshBoundsVolume 을 검색합니다. 볼륨을 레벨로 드래그하여 바닥 메시 위에 배치합니다. NavMeshBoundsVolume 의 스케일을 X = 7, Y = 10, Z = 1로 조절합니다.

    내비메시 바운드 볼륨 액터를 레벨로 드래그합니다

    내비메시 바운드 볼륨의 스케일을 X = 7, Y=10, Z = 1로 조절합니다

  5. 액터 배치(Place Actors) 패널의 셰이프(Shapes) 카테고리에서 스피어(Sphere) 액터 두 개를 레벨로 드래그합니다.

    스피어 액터 두 개를 레벨로 드래그합니다

섹션 결과

이 섹션에서는 새 레벨을 생성하고 내비게이션 메시를 추가했습니다. 또한 에이전트의 타깃 역할을 할 스피어 액터 두 개를 추가했습니다.

3 - 에이전트 만들기

  1. 콘텐츠 드로어(Content Drawer) 에서 우클릭하고 새 폴더(New Folder) 를 선택하여 새 폴더를 생성합니다. 폴더를 NavigationSystem 으로 명명합니다.

  2. 콘텐츠 드로어(Content Drawer) 에서 ThirdPersonBP > Blueprints 폴더로 이동하여 BP_ThirdPersonCharacter 블루프린트를 선택합니다. NavigationSystem 폴더로 드래그하고 여기에 복사(Copy Here) 옵션을 선택합니다.

    ThirdPersonCharacter 블루프린트를 Avoidance 폴더로 드래그하고 여기에 복사를 선택합니다

  3. NavigationSystem 폴더로 이동하여 블루프린트 이름을 BP_NPC_NoAvoidance 로 변경합니다. 블루프린트를 더블클릭하여 열고 이벤트 그래프(Event Graph) 로 이동합니다. 모든 입력 노드를 선택해서 지웁니다.

  4. 이벤트 그래프 를 우클릭한 뒤 커스텀 이벤트 추가(Add Custom Event) 를 검색하고 선택합니다. 이벤트를 MoveNPC 로 명명합니다.

    이벤트 그래프를 우클릭한 뒤 커스텀 이벤트 추가를 검색하고 선택합니다. 이벤트를 MoveNPC로 명명합니다

  5. 내 블루프린트(My Blueprint) 패널에서 변수(Variables) 옆의 추가(+) 버튼을 클릭하여 새 변수를 생성합니다. 변수를 Target 으로 명명합니다.

    변수 옆의 추가 버튼을 클릭하여 새 변수를 생성합니다. 변수를 Target으로 명명합니다

  6. 디테일(Details) 패널에서 변수 유형(Variable Type) 드롭다운을 클릭합니다. 액터(Actor) 를 검색하고 오브젝트 레퍼런스(Object Reference) 를 선택합니다. 인스턴스 편집가능(Instance Editable) 체크박스를 활성화합니다.

    변수 타입을 액터, 오브젝트 레퍼런스로 설정합니다

    인스턴스 편집가능 체크박스를 활성화합니다

  7. Target 변수를 이벤트 그래프 로 드래그하고 Get Target 을 선택합니다. Target 노드에서 드래그하여 아래와 같이 Is Valid 매크로를 검색하고 선택합니다.

    Target 노드에서 드래그하여 Is Valid 매크로를 검색하고 선택합니다

  8. 이벤트 그래프(Event Graph) 를 우클릭한 뒤 셀프 레퍼런스 가져오기(Get reference to self) 를 검색하고 선택합니다.

    이벤트 그래프를 우클릭한 뒤 셀프 레퍼런스 가져오기를 검색하고 선택합니다

  9. 이벤트 그래프(Event Graph) 를 우클릭한 뒤 AI MoveTo 를 검색하고 선택합니다.

    이벤트 그래프를 우클릭한 뒤 AI MoveTo를 검색하고 선택합니다

  10. Is Valid 노드의 Is Valid 핀을 AI MoveTo 노드에 연결합니다. Self 노드를 AI MoveTo 노드의 Pawn 핀에 연결합니다. Target 변수를 드래그하여 AI MoveTo 노드의 Target Actor 핀에 연결합니다.

    Is Valid 노드를 AI MoveTo노드에 연결합니다. Target 변수를 AI MoveTo 노드에 연결합니다

  11. 이벤트 그래프 를 우클릭한 뒤 이벤트 BeginPlay 를 검색하고 선택합니다. BeginPlay 이벤트 노드에서 드래그하여 MoveNPC 를 검색하고 선택합니다.

    이벤트 그래프를 우클릭한 뒤 이벤트 BeginPlay를 검색하고 선택합니다

    BeginPlay 이벤트 노드에서 드래그하여 MoveNPC를 검색하고 선택합니다

  12. 블루프린트를 컴파일(Compile) 하고 저장(Save) 합니다. 최종 블루프린트는 아래 이미지와 같습니다.

    최종 블루프린트 구성입니다

  13. BP_NPC_NoAvoidance 블루프린트를 레벨로 드래그한 뒤 디테일(Details) 패널에서 Target 옆 드롭다운을 클릭하여 에이전트 앞의 스피어(Sphere) 액터를 검색하고 선택합니다.

    BP_NPC_NoAvoidance 블루프린트를 레벨로 드래그합니다

    Target 옆 드롭다운을 클릭하여 스피어 액터를 검색하고 선택합니다

  14. BP_NPC_NoAvoidance 블루프린트를 아래와 같이 복제합니다.

    BP_NPC_NoAvoidance 블루프린트를 복제합니다

  15. 마지막 두 단계를 반복하여 레벨 반대편에 에이전트 그룹을 하나 더 생성하고 그 앞에 스피어 를 타깃으로 배치합니다.

  16. 시뮬레이트(Simulate) 를 클릭하여 에이전트가 목표를 향해 이동하는 모습을 확인합니다. 회피가 없으므로 레벨 중앙에서 콜리전이 발생합니다.

    시뮬레이트를 클릭하여 에이전트가 목표를 향해 이동하는 모습을 확인합니다

섹션 결과

이 섹션에서는 회피를 사용하지 않고 목표를 향해 이동하는 에이전트를 생성했습니다.

4 - 에이전트에 RVO 회피 추가하기

  1. 콘텐츠 드로어(Content Drawer) 에서 BP_NPC_NoAvoidance 블루프린트를 우클릭하고 복제(Duplicate) 를 선택합니다. 새 블루프린트를 BP_NPC_RVO 로 명명합니다.

    BP_NPC_NoAvoidance 블루프린트를 복제한 후 BP_NPC_RVO로 명명합니다

  2. BP_NPC_RVO 블루프린트를 더블클릭하여 블루프린트 에디터를 엽니다. 캐릭터 무브먼트(Character Movement) 컴포넌트를 선택하고 디테일(Details) 패널에서 캐릭터 무브먼트: 회피(Character Movement:Avoidance) 섹션으로 이동합니다.

    캐릭터 무브먼트 컴포넌트를 선택합니다

    회피 섹션으로 이동합니다

  3. RVO 회피 사용(Use RVOAvoidance) 체크박스를 활성화하고 회피 고려 반경(Avoidance Consideration Radius)100 으로 설정합니다.

    RVO 회피 사용 체크박스를 활성화하고 회피 고려 반경을 100으로 설정합니다

  4. 블루프린트컴파일(Compile) 하고 저장(Save) 합니다. 이제 에이전트에 RVO 회피가 활성화되었습니다.

  5. BP_NPC_RVO 블루프린트를 레벨로 몇 개 드래그하고 이전과 동일하게 환경설정합니다. 시뮬레이트(Simulate) 를 클릭하여 결과를 확인합니다.

    BP_NPC_RVO 블루프린트를 레벨로 몇 개 드래그하고 이전과 동일하게 환경설정합니다

섹션 결과

이 섹션에서는 에이전트에 RVO 회피를 추가하는 방법을 알아보았습니다.

5 - 에이전트에 크라우드 우회 회피 추가하기

  1. 콘텐츠 드로어(Content Drawer) 에서 BP_NPC_NoAvoidance 블루프린트를 우클릭하고 복제(Duplicate) 를 선택합니다. 새 블루프린트를 BP_NPC_DetourCrowd 로 명명합니다.

    BP_NPC_NoAvoidance 블루프린트를 복제한 뒤 BP_NPC_DetourCrowd로 명명합니다

  2. BP_NPC_DetourCrowd 블루프린트를 더블클릭하여 엽니다. 디테일(Detail) 패널에서 AI 컨트롤러(AI Controller) 를 검색합니다.

    디테일 패널에서 AI 컨트롤러를 검색합니다

  3. AI 컨트롤러 클래스(AI Controller Class) 옆 드롭다운을 클릭하고 DetourCrowdAIController 를 선택합니다.

    AI 컨트롤러 클래스 옆 드롭다운을 클릭하고 DetourCrowdAIController를 선택합니다

  4. 블루프린트를 컴파일(Compile) 하고 저장(Save) 합니다. 이제 에이전트에서 크라우드 우회 회피가 활성화되었습니다.

  5. BP_NPC_DetourCrowd 블루프린트를 레벨로 몇 개 드래그하고 이전과 동일하게 환경설정합니다. 시뮬레이트(Simulate) 를 클릭하여 결과를 확인합니다.

    BP_NPC_DetourCrowd 블루프린트를 레벨로 몇 개 드래그하고 이전과 동일하게 환경설정합니다

  6. 세팅(Settings) > 프로젝트 세팅(Project Settings) 에서 크라우드 매니저(Crowd Manager) 섹션으로 이동하여 크라우드 우회 매니저(Detour Crowd Manager) 세팅을 조정할 수도 있습니다.

    프로젝트 세팅을 클릭합니다

  7. 이 섹션에서는 시스템에 사용되는 최대 에이전트(Max Agents) 나 회피 계산에 사용되는 최대 에이전트 반경(Max Agent Radius)크라우드 우회 매니저 시스템의 여러 세팅을 조정할 수 있습니다.

    이 섹션에서는 크라우드 우회 매니저 시스템의 여러 세팅을 조정할 수 있습니다

섹션 결과

이 섹션에서는 에이전트에 크라우드 우회 회피를 추가하는 방법을 알아보았습니다.

태그