1 - 필수 설정
- 언리얼 프로젝트 브라우저(Unreal Project Browser)의 새 프로젝트 카테고리(New Project Categories) 섹션에서 게임(Games) 및 삼인칭(Third Person) 템플릿을 선택합니다.
- 블루프린트(Blueprint) 와 시작용 콘텐츠 없음(No Starter Content) 옵션을 선택한 뒤 생성(Create) 을 클릭합니다.
섹션 결과
새 삼인칭 프로젝트를 생성했으니 이제 내비게이션 시스템을 배울 준비가 되었습니다.
2 - 내비게이션 메시 빌드
이 섹션에서는 내비게이션 메시 바운드 볼륨(Navigation Mesh Bounds Volume) 을 사용하여 레벨에서 내비게이션을 생성할 영역을 지정합니다. 이 정보는 에이전트가 레벨을 이동하여 목적지에 도달하는 데 사용됩니다.
- 프로젝트의 디폴트 ThirdPersonExampleMap 에서 액터 배치(Place Actors) 패널로 가서 NavMeshBoundsVolume 을 검색하고 레벨로 드래그합니다.
- NavMeshBoundsVolume 을 선택한 채 디테일(Details) 패널에서 볼륨의 스케일을 X = 20, Y = 20, Z = 5로 조절합니다. 아래와 같이 볼륨을 움직여서 플레이 영역 전체를 덮게 합니다.
- 아웃라이너(World Outliner) 창에서 BP_ThirdPersonCharacter 블루프린트를 선택한 뒤 레벨에서 제거합니다.
- 키보드로 P 를 누르면 레벨에서 내비게이션 메시를 시각화할 수 있습니다. 내비게이션 메시는 기본적으로 아래 이미지에서와 같이 녹색으로 시각화됩니다.
- 언리얼 엔진은 내비메시 바운드 볼륨(Nav Mesh Bounds Volume) 액터가 레벨에 추가되거나 크기 조정되는 즉시 자동으로 내비게이션 메시를 생성합니다.
- 내비게이션 메시가 계단에서 비주얼 아티팩트를 일으키는 것이 보입니다. 내비게이션 메시는 레벨의 콜리전을 간소화해서 표현하기 때문입니다. 아웃라이너(Outliner) 창에서 RecastNavMesh-Default 액터를 선택한 뒤 디테일 (Details ) 패널로 이동합니다. 디스플레이(Display) 섹션으로 이동하여 오프셋 그리기(Draw Offset) 값을 50 으로 설정합니다. 그러면 내비게이션 메시가 그려진 곳에서 높이 오프셋이 조절되어 더 알아보기 쉽습니다.
섹션 결과
이 섹션에서는 내비메시 바운드 볼륨 액터를 레벨에 추가하고 플레이 영역에 맞게 스케일을 조절했습니다. 또한 P를 눌러서 최종 내비게이션 메시를 시각화하는 방법을 알아보았습니다.
4 - 첫 에이전트 생성하기
이 섹션에서는 간단한 에이전트를 생성하고 주변에서 랜덤 위치를 선택하여 이동하는 식으로 레벨에서 돌아다니게 하겠습니다. 이 에이전트는 목적지에 도착하면 몇 초 대기한 뒤 같은 프로세스를 반복할 것입니다.
- 콘텐츠 드로어(Content Drawer) 에서 우클릭하고 새 폴더(New Folder) 를 선택하여 새 폴더를 생성합니다. 폴더를 NavigationSystem 으로 명명합니다.
- 콘텐츠 드로어(Content Drawer) 에서 ThirdPersonBP > Blueprints 폴더로 이동하여 BP_ThirdPersonCharacter 블루프린트를 선택합니다. NavigationSystem 폴더로 드래그하고 여기에 복사(Copy Here) 옵션을 선택합니다.
- NavigationSystem 폴더로 이동하여 블루프린트 이름을 BP_NPC_NavMesh 로 변경합니다. 블루프린트를 더블클릭하여 열고 이벤트 그래프(Event Graph) 로 이동합니다. 모든 입력 노드를 선택해서 지웁니다.
- 이벤트 그래프 를 우클릭한 뒤 커스텀 이벤트 추가(Add Custom Event) 를 검색하고 선택합니다. 이벤트를 MoveNPC 로 명명합니다.
- 이벤트 그래프 를 우클릭한 뒤 Get Actor Location 을 검색하고 선택합니다.
- GetActorLocation 노드에서 드래그하여 GetRandomReachablePointInRadius 를 검색하고 선택합니다. Radius 를 1,000유닛으로 설정합니다.
- GetRandomReachablePointInRadius 노드의 Random Location 핀을 드래그하여 변수로 승격(Promote to variable) 을 선택합니다.
- 방금 만든 RandomLocation 노드에 MoveNPC 노드를 연결합니다.
- 이벤트 그래프(Event Graph) 를 우클릭한 뒤 AI MoveTo 를 검색하고 선택합니다. RandomLocation 노드를 AI MoveTo 노드에 연결합니다.
- 이벤트 그래프 를 우클릭한 뒤 셀프 레퍼런스 가져오기(Get a 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 를 검색하고 선택합니다.
- 블루프린트를 컴파일(Compile) 하고 저장(Save) 합니다.
- BP_NPC_NavMesh 블루프린트를 레벨로 드래그하고 시뮬레이트(Simulate) 를 클릭합니다. 에이전트가 레벨에서 돌아다니는 것을 볼 수 있습니다.
이번에는 AI들이 지정된 기둥들로 다니게 해보겠습니다.
일단 맵에 기둥들을 새웁니다. 적당히 실린더를 놓습니다.
BP_PatrolPoint라는 Actor블루프린트를 만들고 변수를 설정합니다.
BP_NPC에 기둥들을 찾에 BP_Patrol 변수에 저장하는 로직을 넣습니다.
BP_NPC에도 같은 변수를 만들어줘 복사해주면 됩니다.
TargetList중 한곳을 뽑아 그 위치를 중심으로 랜덤위치를 찾아
AI MoveTo를 이용해서 움직이게 해줍니다.
'언리얼수업 > 최종프로젝트' 카테고리의 다른 글
폰빙의 Possess (0) | 2024.03.02 |
---|---|
Moving Actor - TimeLine Lerp (0) | 2024.02.28 |
NAV LINK PROXY (1) | 2024.02.28 |
AI 멀티 비헤이버트리 (1) | 2024.02.27 |
1일차 프로토 레벨만들기 (0) | 2024.02.16 |