[패스트캠퍼스 수강 후기] 올인원 패키지 : 유니티 포트폴리오 완성 100% 환급 챌린지 8회차 미션 시작합니다.


환경 시스템중 네비게이션 시스템 알아보기와 적 캐릭터 AI 구현 모델에 대해서 공부하는 시간입니다.


일단 저번시간에 배운 Terrain 시스템 중 나무를 처리하는 부분중 괜찮은 유틸리티에 대한 소개입니다.
TreeIt: Tree Generator 라는 무료 유틸리티 소개 www.evolved-software.com/treeit/treeit

 

TreeIt | Tree Generator

 

www.evolved-software.com

 

 


네비게이션 시스템은 게임 월드에서 이동할 수 있는 길찾기 시스템입니다. 네비게이션 시스템의 단점은 NavMesh위에 항상 NavMeshAgnet가 존재해야 한다는 점입니다.

이 문제를 해결하려면 캐릭터 콘트롤의 navMesh를 사용하는 것이 아니라 단순히 길찾기만 사용하는 방법도 있습니다. CalculatePath() 함수에 대해 알아보시면 됩니다.

NavMesh는 캐릭터가 걸어다닐 수 있는 표면들을 Mesh로 표현한 것입니다.
NavMeshAgent는 GameObject가 원하는 목표로 지정했을 때 경로를 계산해주고 장해물과 또다른 Agent들끼리의 충돌을 피할 수 있도록 해줍니다.
NavMeshObstacle는 Agent가 경로를 탐색하는 동안 회피해야하는 움직이는 장해물들을 정의할 수 있습니다. 문이 열리고 닫히는 등의 작업에 사용할 수 있습니다.
OffMeshLink는 Agent가 연결되지 않은 내부 Mesh를 이동하는 방법에 대한 정의입니다. 특정 영역에 대해서 Agent가 Jump를 통해서만 이동할 수 있는 등의 특수한 경로라고 보면 될 것같습니다.



네비게이션 편집을 위해서 [Window] - [AI] - [Navigation] 메뉴로 진입합니다.
처음에는 아무것도 없는 Level이 표시됩니다. Navigation Mesh도 Baking 한다고 표현합니다.

[Object] 탭으로 진행하여 [Mesh Renderers] 필터를 클릭하고, Hierarchy 뷰에서 NavMesh를 정의할 GameObject들을 선택하고 "Navigation Static [v]"을 Check하여 주고, Navigation Area는 "Walkable"을 선택하여 줍니다. 예제에서는 Floor와 이동가능한 계단으로 설정된 Cube들을 선택하였습니다.
이렇게 Navigation Static [v]을 선택해야 NavMesh에서 사용되는 영역으로 Baking 됩니다.

Terrain이 있는 경우 [Terrains] 탭으로 진입하여 마찬가지로 "Navigation Static [v]"과 "Walkable"을 선택해주면 됩니다.


[Bake] 탭으로 이동하여 아래와 같이 각종 옵션들을 설정하고 [Bake]를 클릭하여 Baking을 시작합니다.

+ Agent Radius: 0.5
+ Agent Height: 2
+ Max Slope: 45
+ Step Height: 0.3

아래 2개의 값은 "Off Mesh Link"를 Baking 하게될 때 참고하는 값입니다. 여기서는 자동적으로 하지 않을 것이라서 0으로 처리합니다.

+ Drop Height: 0
+ Jump Distance: 0

Baking을 완료하면 GameObject가 이동할 수 있는 NavMesh가 생성된 것을 확인할 수 있습니다.


GameObject가 걸어 올라갈 수 없는 컨테이너, 박스 같은 오브젝트는 "Not Walkable"로 설정하는 것이 좀 더 좋겠지요.



Scene View를 보는 상태로 플레이를 진행해 봅니다. Game View에서 특정 위치를 클릭하면 자동으로 계산된 NavMesh를 보여주며 캐릭터가 이동하는 것을 볼 수 있습니다. 이를 활용하면 NavMesh와 NavMeshAgent가 정상동작하는지 등을 디버깅하는데 도움이 됩니다.





Off Mesh Link는 컴포넌트입니다.
Jump_Link GameObject에 "Off Mesh Link" 컴포넌트를 추가합니다.
Jump_Link GameObject의 자식으로 "Start", "End"라는 Sphere를 2개 구성해줍니다.
Start 구는 언덕 위에 배치하고, End 구는 Floor 위에 배치하여 줍니다.

[Off Mesh Link] 옵션을 설정합니다.
+ Start = Start (Transform) - 위에 설정한 Start GameObject 설정
+ End = End (Transform) - 위에 설정한 End GameObject 설정
+ Cost Override = -1 - 길찾기를 할 때 현재 Off Mesh Link가 얼마정도의 길찾기 비용이 들어가는가 설정
+ Bi Directional = [ ] - Check를 해주게 되면 양방향 이동이 가능하게 됩니다. 여기서는 언덕에서 내려오는 것이므로 Uncheck 합니다.
+ Activated = [v] - 현재 Off Mesh Link의 활성화 여부. 특정 아이템을 가진 경우에만 이동 가능과 같은 기능을 구현할 때 사용.
+ Auto Update Positions = [v] - Agent에 대한 위치를 자동화으로 업데이트
+ Navigation Area = Jump



실행하면 다음과 같이 구동되는 것을 볼 수 있습니다. "Bi Directional [v]"을 Check하면 End 점에서 Start 점으로 날아서 점프하는 멋진 모습을 볼 수 있네요 ㅋㅋㅋ



Off Mesh Link 자동 생성

[Bake] 탭 - [Generated Off Mesh Links]의 값에서
+ Drop Height = 5
+ Jump Distance = 5
정도로 설정을 해줍니다.

[Object] 탭 - Floor와 Cube로 구성된 Stair를 선택하고 "Generate OffMeshLinks [v]"를 체크한 후에 [Bake]를 클릭하여 Baking 하면 됩니다. 아래와 같이 생성된 Off Mesh Link를 확인할 수 있습니다.






동적 장애물에 대한 NavMeshObstacle 설정하기.

Cube GameObject를 하나 추가합니다.
컴포넌트 추가를 하여 "Nav Mesh Obstacle"을 검색하여 추가합니다.

설정값중.
Carve = [v] - Agent가 이 Object에 대한 회피값 설정
Move Threshold = 0.1 - 이동시 얼마나 회피할 것인가
Time To Stationary = 0.5 - 이 Object가 이동할 때 내부 Mesh를 얼마나 빨리 갱신할 것인가


구동을 해보면 실시간으로 이동가능한 경로가 생기거나 사라지게 하거나 하는 것이 가능합니다.




앞으로 강의에 사용하게 될 Map을 소개해 주시네요.


와우 멋집니다 ^^~ㅎㅎ 대신 저 정도의 퀄러티는 유료 에셋을 구매하여 구성한 것이라고 합니다.
유료 에셋은 게임에 어느정도 최적화된 에셋들이 에셋 스토어에 많기 때문에 포트폴리오 제작 등에 많이 도움이 될 것입니다.

해당 레벨은 총 3개의 방으로 구성되어 있습니다.
방의 연결 부분들은 문이나 함정 등을 설정하여 사용할 수 있도록 할 예정입니다.
방마다 조금씩 다른 Lighting System을 적용해 두었고, Light Probe도 적용되어 있습니다. 현재 촘촘하게 하여 Texture가 18장이라 메모리 용량이 커진 상태입니다.
위에서 공부한 NavMesh도 적용하여 이동가능한 위치 설정이 완료된 상태입니다.




문같은 테스트를 위해 Cube 오브젝트를 적당한 크기로 방과 방 사이에 배치해 주고 "Nav Mesh Obstacle"을 설정하여 캐릭터가 이동하지 못하게 바로 설정이 가능합니다.



포트폴리오를 위한 게임 레벨을 구성을 할때의 팁입니다.

+ Random dungeon generator watabou.itch.io/one-page-dungeon

 

One Page Dungeon by watabou

One page dungeon generator

watabou.itch.io

무작정 맵을 그리는 것이 아니라 미리 어느 정도 잘 구성된 맵을 구성하여 사용가능합니다.

+ 스냅핑 기능을 위한 ProGrids
 [Window] - Package Manager - Advanced - Show preview packages에서 "ProGrids"를 검색하여 설치합니다.
 오브젝트들의 배치들을 편하게 도와주는 기능이라고 보시면 됩니다.

 
 
 
 
 

  
게임 캐릭터의 AI 구현하기
 
AI 구현 모델들
+ Finit State Machine
+ Behavior Tree
+ 캐릭터 AI 구현
+ 캐릭터 시야 및 향상된 AI 구현 




좌측 Finit State Machine 유한 상태 머신은 캐릭터의 상태 Transition에 대한 제어를 직관적으로 할 수 있습니다.
우측 Behavior Tree는 캐릭터의 행동에 대한 기능과 제약을 직관적으로 할 수 있습니다.

FSM
한번에 하나의 상태만 가능합니다. 한 상태에서 다른 상태로의 이전은 Transition입니다.
사각형 박스는 Node, 화살표는 Transition이라고 보면 됩니다.

내용중 주황색으로 표시된 "player is near"를 보면 캐릭터가 돌아다니는 상태에서 주변에 다른 플레이어나 적이 나타나는 경우 "공격" state로 전환되는 transition이 발생하게 됩니다.

Behavior Tree의 Node 3가지 종류
+ Control node = Selector(특정 행동 선택), Sequence(자식 노드들을 순차적으로 수행) 등.
+ Decorator node = if문, loop문 등
+ Execution node = Action. 특정 행동을 수행.



예를 들어 위와 같은 특정 루틴을 수행해야 하는 시퀀스가 있다고 했을 때, 가진 돈이 200원 미만이 되면 "If Decorator" node가 failure를 부모 "Sequence"에 return하고, 결론적으로 전체 root가 Failure로 처리되어 특정 Sequence 동작 전체가 Failure 상태임을 처리할 수가 있게 됩니다.

성공 상황은 쉽겠지요 ^^.  하위 노드가 모두 수행되어 "Action 6"인 의자에 앉는다 까지 모두 Success로 성공하게 되면, 모든 Sequence 동작이 정상적으로 수행되었음을 "Success"로 처리되어 확인하게 됩니다.

이렇듯 Behavior Tree는 특정 흐름들을 제어할 수 있도록 도와주는 AI 모델이라고 보면 됩니다.


아직 구현은 하지 않았지만 벌써 상상이 가네요 ㅠ.ㅜ; Node Editor 같은 화면에서 함수들을 저렇게 Tree 구조로 배치하면 동적으로 조건들이 처리될테고.. 기존 if-else로 지저분하게 만들던 코드들을 깔끔하게 처리할 수 있겠네요. 정말 머리 좋습니다. 대단 대단.




패스트캠퍼스 - 올인원 패키지 : 유니티 포트폴리오 완성 bit.ly/2R561g0

 

유니티 게임 포트폴리오 완성 올인원 패키지 Online. | 패스트캠퍼스

게임 콘텐츠 프로그래머로 취업하고 싶다면, 포트폴리오 완성은 필수! '디아블로'와 '배틀그라운드' 게임을 따라 만들어 보며, 프로그래머 면접에 나오는 핵심 개념까지 모두 잡아 보세요!

www.fastcampus.co.kr

 

+ Recent posts