
NavMesh 는 간단히, 길찾기 경로라고 보면 된다.
팀 프로젝트에서 적이 플레이어에게 근접하는 AI 에 대한 구현을 위해
강사님이 키워드를 던저 주셨고
난 그저
덥썩 물었다.
그 내용에 대한 정리 문서이다.
NavMesh 의 기본적인 개념은, 움직이는 오브젝트가 움직일 수 있는 영역에 대한 정의를 해 준 후, 특정 알고리즘에 맞춰 Goal 로 적절히 움직여 주는 기능이라 볼 수 있다.
NavMesh 는 A* 알고리즘을 통해 길찾기가 구현되어 있다.
오브젝트가 움직일 수 있는 영역에 대한 정의 이다.

먼저, Plane 을 이용하여 Ground 를 정의 해 주었다.
해당 오브젝트는 Ground라는 Layer 를 추가 및 할당하여 추후 활용 용도로 지정하였다.

Plane 에 NavMeshSurface를 설정한다. 기본 내용은 메뉴얼을 참고 바라며,
필자는 유연한 대응을 위해 Use Geometry를 Physics Colliders로 하였다. 이 옵션을 사용하면 Collider 기반으로 보다 벽면에 바짝 확인할 수 있다고 한다.
그리고 Include Layers에 기존에 설정한 Ground를 설정하였다.
그리고 Bake를 하면 아래와 같은 그림처럼 된다.

(무슨 테니스장처럼 생겼다)
그냥 평면에서 길 찾기를 하면 의미가 없으니, 중간에 장애물을 두기 위해 아래와 같은 맵으로 구성하였다.

NavMeshObstacle은 해당 오브젝트를 진행에 방해되는 요소로 해주기 위한 컴포넌트이다.
그냥 추가하면 별다른 변화가 없다. (모양은 대강 맞게 맞춰보자)

여기서 한글로는 퍼내기라고 해석되는 Carve라는 기능이 있는데 이것을 필히 Enable 해줘야 한다

그럼 아래와 같이 장애물 주변에 파란 영역이 사라지는 것을 볼 수 있다. 이제 길을 찾아가야 하는 오브젝트는 파란 영역만 움직이기 때문에 사라진 영역은 갈 수 없는 영역이라 생각하고 진행하지 않게 된다.

이제 길을 찾을 친구와 목표 지점에 대해 알아보자.
아래 사진에 빨간색이 파란색을 찾아 가는 것으로 보면 된다.

오브젝트를 만들 때 방해물보다 높지 않도록 유의하자. 만약 그렇다면 넘어갈 수 있다고 착각해 이상하게 동작하게 된다.
Goal 인 파란 친구는 별다른 것을 할 필요가 없다.
빨간 친구에게 NavMesh Agent라는 컴포넌트 부터 생성해주자

다른 부분보다 아래 내용에 대해서만 잘 조절해도 충분하다.
// Movement.cs
using UnityEngine;
using UnityEngine.AI;
public class MoveEnemy : MonoBehaviour
{
public Transform target;
private void Start()
{
NavMeshAgent agent = GetComponent<NavMeshAgent>();
agent.SetDestination(target.position);
}
}
위 코드는 메뉴얼에서 제공하는 내용 + IDE 가 추천하는 함수를 이용한 것이다.
Off Mesh Link 는 중간에 끊기는 길이 있을 경우 어느 정도까지는 무시하고 지나갈 수 있게 해주는 기능이다. 맵을 만들다 보면 그런 구간이 생각보다 많이 생기기 때문에 알아두면 좋은 기능이다. (현재 위 상태에서는 굳이 사용할 필요는 없다)

메뉴얼상으로는 중간에 물이 있거나 용암지대 같은 것에 대한 설정도 가능하며, 고저차에 따른 다른 길 탐색을 위한 Cost설정이 가능하여 직진 거리가 짧아도 Cost가 너무 크면 다른데로 돌아가게 할 수도 있다고 한다. 이번 팀 프로젝트에서는 굳이 그렇게 까진 할 필요는 없을 것 같다.
약간의 고저차가 있는 지형에서는 위에 언급한 기능만 사용하여도 충분히 대응이 가능해 보인다. 우선 이렇게 간단히 적용해 보고 추후 좋은 방법을 더욱 연구하면 좋을 것 같다.
고저차, 즉 언덕의 기울기에 따른 경로 설정이 가능하다. Windows -> AI -> Navigation 을 킨 후 "Agent"에서 Max Slope 를 수정하여 넘어갈 수 있는 언덕의 경사를 지정하면 그보다 높은 경사는 잘 피해갈 수 있게 된다.