개요
언리얼 엔진의 내비게이션 시스템(Navigation System) 은 에이전트가 내비게이션 메시(Navigation Mesh) 를 사용하여 레벨 내에서 경로를 찾고 이동하게 합니다. 내비게이션 시스템에는 내비게이션 메시의 다양한 런타임 생성(Runtime Generation) 메서드뿐 아니라 특정 타깃을 중심으로 부분적인 내비게이션을 생성하는 방법도 있습니다.
내비게이션 인보커(Navigation Invoker) 는 런타임에서 에이전트 주변에 내비게이션 메시를 생성하는 블루프린트 액터 컴포넌트입니다. 내비게이션 인보커를 사용하면 내비게이션 메시를 에디터에서 빌드할 필요가 없어지며 런타임에서 생성되는 타일 수를 제한할 수 있습니다.
내비게이션 인보커는 에디터에서 내비게이션 메시를 빌드하는 것이 실용적이지 못한 대규모 레벨에 이상적입니다.
목표
이 가이드에서는 에이전트에 내비게이션 인보커를 사용하여 게임플레이 도중에 내비게이션 메시를 생성하는 방법을 알아봅니다.
세부 목표
-
새 레벨을 생성하고 내비게이션 인보커에 사용할 내비게이션 시스템을 환경설정합니다.
-
내비게이션 인보커를 사용하여 레벨을 돌아다니도록 ThirdPersonCharacter 블루프린트를 수정합니다.
1 - 필수 구성
-
언리얼 프로젝트 브라우저(Unreal Project Browser)의 새 프로젝트 카테고리(New Project Categories) 섹션에서 게임(Games) > 삼인칭(Third Person) 템플릿을 선택합니다.
-
블루프린트(Blueprint) 와 시작용 콘텐츠 없음(No Starter Content) 옵션을 선택한 뒤 생성(Project) 을 클릭합니다.
섹션 결과
새 삼인칭 프로젝트를 생성했으니 이제 내비게이션 인보커를 배울 준비가 되었습니다.
2 - 테스트 레벨 만들기
-
메뉴 바에서 파일(File) > 새 레벨(New Level) 을 클릭합니다.
-
기본(Basic) 레벨을 선택합니다.
-
아웃라이너(Outliner) 에서 Floor 스태틱 메시 액터를 선택하고 디테일(Details) 패널로 이동합니다. 스케일(Scale) 을 X = 100, Y = 100, Z = 1로 설정합니다.
-
세팅(Settings) > 프로젝트 세팅(Project Settings) 을 클릭하고 내비게이션 시스템(Navigation System) 카테고리로 이동합니다. Navigation Invoker 주변에만 내비게이션 생성(Generate Navigation Only Around Navigation Invokers) 체크박스를 활성화합니다.
-
내비게이션 메시(Navigation Mesh) 카테고리로 이동하여 런타임(Runtime) 섹션으로 내려갑니다. Runtime Generation 드롭다운을 클릭하고 Dynamic 을 선택합니다.
-
액터 배치(Place Actors) 패널에서 NavMeshBoundsVolume 을 검색합니다. 볼륨을 레벨로 드래그하여 바닥 메시 위에 배치합니다. NavMeshBoundsVolume 의 스케일을 X = 500, Y = 500, Z = 10로 조절합니다.
섹션 결과
이 섹션에서는 새 레벨을 생성하고 내비게이션 인보커에 사용할 내비게이션 시스템을 구성했습니다.
3 - 에이전트 만들기
-
콘텐츠 드로어(Content Drawer) 에서 우클릭하고 새 폴더(New Folder) 를 선택하여 새 폴더를 생성합니다. 폴더를 NavigationSystem 으로 명명합니다.
-
콘텐츠 드로어(Content Drawer) 에서 ThirdPersonBP > Blueprints 폴더로 이동하여 BP_ThirdPersonCharacter 블루프린트를 선택합니다. NavigationSystem 폴더로 드래그하고 여기에 복사(Copy Here) 옵션을 선택합니다.
-
NavigationSystem 폴더로 이동하여 블루프린트 이름을 BP_NPC_Invoker 로 변경합니다. 블루프린트를 더블클릭하여 열고 이벤트 그래프(Event Graph) 로 이동합니다. 모든 입력 노드를 선택해서 지웁니다.
-
이벤트 그래프 를 우클릭한 뒤 커스텀 이벤트 추가(Add Custom Event) 를 검색하고 선택합니다. 이벤트를 MoveNPC 로 명명합니다.
-
이벤트 그래프 를 우클릭한 뒤 Get Actor Location 을 검색하고 선택합니다.
-
GetActorLocation 노드에서 드래그하여 GetRandomReachablePointInRadius 를 검색하고 선택합니다. Radius 를 1000으로 설정합니다.
-
GetRandomReachablePointInRadius 노드의 Random Location 핀을 드래그하여 변수로 승격(Promote to variable) 을 선택합니다.
-
방금 만든 RandomLocation 노드에 MoveNPC 노드를 연결합니다.
-
이벤트 그래프(Event Graph) 를 우클릭한 뒤 AI MoveTo 를 검색하고 선택합니다. RandomLocation 노드를 AI MoveTo 노드에 연결합니다.
-
이벤트 그래프 를 우클릭한 뒤 셀프 레퍼런스 가져오기(Get reference to self) 를 검색하고 선택합니다.
-
Self 노드를 AI MoveTo 노드의 Pawn 핀에 연결합니다. 아래와 같이 Random Location 노드의 노란색 핀을 AI MoveTo 노드의 Destination 핀에 연결합니다.
-
AI MoveTo 노드의 On Success 핀에서 드래그하여 Delay 를 검색하고 선택합니다. Delay 노드의 Duration 을 4 로 설정합니다. 아래와 같이 Delay 노드의 Completed 핀에서 드래그하여 Move NPC 를 검색하고 선택합니다.
-
위 단계를 반복하여 AI MoveTo 노드의 On Fail 핀에도 두 노드를 추가합니다. Delay 노드의 Duration 을 0.1로 설정합니다.
-
이벤트 그래프 를 우클릭한 뒤 이벤트 BeginPlay 를 검색하고 선택합니다. BeginPlay 이벤트 노드에서 드래그하여 MoveNPC 를 검색하고 선택합니다.
-
컴포넌트(Component) 탭에서 +추가(+Add) 드롭다운을 클릭한 뒤 네비게이션 인보커(Navigation Invoker) 를 검색하고 선택합니다.
-
NavigationInvoker 컴포넌트를 선택한 채 디테일(Details) 패널에서 내비게이션(Navigation) 섹션을 찾습니다. 여기서 내비게이션 메시 타일이 생성되는 액터 주변 반경인 Tile Generation Radius 와 내비게이션 메시 타일이 제거되는 액터 주변 반경인 Tile Removal Radius 를 변경할 수 있습니다. 이 예시에서는 이 값들을 각각 3000 과 5000 으로 설정합니다.
-
블루프린트를 컴파일(Compile) 하고 저장(Save) 합니다.
-
BP_NPC_Invoker 블루프린트를 레벨로 여러 개 드래그하고 시뮬레이트(Simulate) 를 클릭하여 각 에이전트 주변에 생성되는 내비게이션을 봅니다.
내비게이션이 보이지 않으면 키보드에서 P를 눌러 내비게이션 메시를 시각화합니다.
섹션 결과
이 섹션에서는 레벨에서 돌아다니는 에이전트를 만들고 내비게이션 인보커 컴포넌트를 사용하여 에이전트 주변에 내비게이션 메시를 생성했습니다.