티스토리 뷰

유니티 상에서는 AI 길찾기 로직을 기본적으로 제공한다.

이에 대해서는 다소 순서가 어긋나긴 했지만, 응용 버전인 2D 환경에서의 활용을 먼저 다뤘었다.

[참고 URL: https://lsu0503.tistory.com/114] [이걸 안다뤘을 줄은 몰랐지...]

 

AI 네비게이션 자체는 성능이 이래저래 많은 편인데, 본문에서는 간단하게 사용법 만 글로 설명하고, 본론으로 넘어갈까 한다.

[아무래도, 지금 다루기에는 다소 늦은 감이 있어서...;;]

 


AI Navigation?

AI Navigation은 유니티 상에서 기본으로 지원되는 자동 경로 탐색 패키지다.

[사용법은 간단한데, 지원되는 기능이 많아서 사실 좀 더 알아봐야 할 거 같은 기능이긴 하지만...;;]

알고리즘으로는 A*알고리즘을 사용한다.

 

사용법은 간단한데, 필드를 구성하는 오브젝트들에 지형 특성을 부여한 뒤 Bake를 하면, 그에 따라서 nav Agent를 가지고 있는 오브젝트들을 이동시키는 구성이기 때문에, '지형 특성 부여'와 'Bake', 'nav Agent' 및 'nav Obstacle'의 사용법 만 익히면 바로 사용할 수 있다.

 

사전 설정

본 패키지는 유니티 초기 상태에는 포함되어 있지 않다. 때문에 Window - Package Manager에서 AI navigation을 Import 해야지 사용이 가능하다.

또한, Window - AI - Navigation을 이용해서 미리 관련 도구 창을 열어놓는 것이 좋다.

navMeshPlus와는 달리, AI navigation은 이 Navigation 창에서 대부분의 조작을 하기 때문이다.

 

지형 특성 부여

Navigation 창의 Areas 탭을 보면 지정할 수 있는 속성 목록을 볼 수 있다. [좌]

이 창에서 속성 목록을 지정한 뒤, MeshRenderer를 가지고 있는 오브젝트를 선택하면 우측 처럼, 속성을 선택할 수 있는 화면이 표시된다. 여기서 Navigation Area로 속성을 선택하면 끝.

 

Bake

이후, Bake 탭에서 Bake를 누르면 하술할 nav 계열 컴포넌트들을 활용할 수 있는 공간이 지정된다.

 

navMeshAgent

본 알고리즘을 통해서 움직이는 주체.

여기서는 간단한 사항들 만 지정하고, 실 동작은 스크립트로 작성해야 한다.

기본적인 활용법은 '목표 지점까지의 경로를 탐색한 이후 그 경로를 확정' 한다는 구성.

여기서 경로 탐색은 NavMeshAgent.CalculatePath(target, path)를 사용하고, 경로 확정은 NavMeshAgent.SetPath(path)를 사용하면 된다.

중요한 것은 '대상'이 아닌, '위치'를 지정해야 한다는 것.

 

참고로, 그냥 NavMeshAgent.SetDestination(target)로 경로 지정을 해도 된다.

원하는 방식으로 구성하자.

 

※ 참고로, NavMeshAgent가 기본적으로 이동 공식을 담당하기 때문에 Rigidbody와 혼용할 경우 문제가 발생할 수 있다. 때문에, Rigidbody가 필요하다면 Rigidbody를 쓸 때 말고는 Kinematic으로 구성하도록 스크립트를 구성해야 한다.

 

NavMeshObstacle

Agent가 이동하는 주체라면, 이쪽은 길을 변화시키는 주체에 해당한다.

Carve를 활성화 한 상태라면, 그 상단에서 작성한 모양에 맞춰서 NavMesh에 구멍이 생긴다.

CarveOnlyStation은 '멈춰있을 떄에만 적용하는 지'를 담당하는 변수로, 체크 해제하면 움직이는 도중에도 구멍을 만들고(연산량이 많다.), 체크하면 멈춰있을 때에만 구멍을 만든다.

구멍이 있는 쪽으로는 이동을 하지 않으므로, 이름 처럼 방해물을 만들기 위한 요소.


자, 그러면 본론으로 들어가 보자.

오늘, AI navigation을 정말로 간단하게 함축하면서 까지 설명하려고 했던 점이다.

 

navAgent는 Bake된 범위 밖으로 '절대로' 나갈 수 없다.

절차적 생성으로 실시간 확장을 만들 때 발생한 문제로 알아낸 내용으로, NavMeshAgent는 NavMesh 안에서의 경로 탐색 컴포넌트인지라, NavMesh 바깥으로 나가면 NavMesh 안으로 강제로 이동된다.

때문에 NavMesh가 아예 없다면 (0, 0, 0) 위치로 이동하고, NavMesh 바깥이라면 가장 가까운 NavMesh 경계면으로 이동한다.

 

특히 동적으로 Bake를 할 때에 발생하기 쉬운 문제로, Bake가 되는 동안은 NavMesh가 없어지기 떄문에 (0, 0, 0)으로 강제 이동된다. 물론, 타이밍에 따라서 예외가 생길 수도 있긴 하지만, 적어도 원래 존재했던 오브젝트들은 확실하게 영향을 받을 것이다.

때문에 동적 베이킹을 구현한다고 한다면 반드시 '베이킹 되는 동안에는 NavMesh를 비활성화 시켜야 한다.'


원래는 간단하게 마지막 구문 만 적으려고 했는데, 알고 보니 AI Navigation을 정리하질 않았어서 추가로 정리하느라 시간이 좀 오래 걸렸다...;;

사실 경로 탐색 알고리즘은 AI Navigation을 꼭 사용해야 하는 것은 아니다.

그래도 기본 지원되는 알고리즘이니까 확실하게 알아두는 것이 좋기는 할 것이다.

문제는, AI Navigation에 포함된 컴포넌트가 지금 서술한 내용 보다 훨씬 많다는 것...

공부... 해야겠지...?

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함