[Unity] NavMesh를 활용한 AI Pathfinding 시스템
게임에서 적이나 NPC가 스스로 길을 찾아 움직이는 기능은 매우 기본적이면서도 중요한 요소다. 이를 구현하는 대표적인 방법이 바로 경로 탐색(Pathfinding)이며, 유니티에서는 이를 위한 강력한 기능으로 NavMesh(Navigation Mesh) 시스템을 제공한다. NavMesh는 3D 또는 2D 공간에서 AI가 걸을 수 있는 지형을 자동으로 분석하고, 그 위에서 자연스럽게 목적지를 향해 이동하는 경로를 계산해주는 내장 시스템이다.
NavMesh란?
NavMesh(Navigation Mesh)는 Unity가 제공하는 내비게이션 시스템의 핵심 구성 요소로, AI가 이동 가능한 공간을 삼각형 메쉬 형태로 구성한 데이터 구조다. 이 메쉬 위에서 목적지까지의 최적 경로를 계산하며, 장애물은 자동으로 피하고, 좁은 길도 통과 가능한지 여부를 판단한다.
NavMesh는 단순히 바닥만 인식하는 것이 아니라, 경사, 높이 차, 점프 가능 구간까지 고려할 수 있도록 설계되어 있다. 덕분에 플레이어 또는 NPC가 자연스럽고 지능적으로 이동하는 것처럼 보이게 만든다.
기본 구성 요소
NavMesh 시스템을 활용하기 위해서는 다음과 같은 요소들이 필요하다.
- NavMesh Surface
이동 가능한 영역(바닥 등)을 설정하고, NavMesh 데이터를 생성하는 컴포넌트다. Unity 2022 이상에서는 NavMeshSurface 컴포넌트를 설치해 사용한다. - NavMesh Agent
경로 탐색을 수행하고, 실제로 이동하는 AI 캐릭터에 부착하는 컴포넌트다. 이동 속도, 회전 반경, 가속도 등을 설정할 수 있다. - NavMesh Obstacle
장애물 역할을 하며, AI의 경로에서 피하도록 설정하는 컴포넌트다. 움직이는 오브젝트에도 사용할 수 있으며, Carve 옵션을 통해 NavMesh를 실시간으로 갱신하게 할 수 있다.
사용 방법
- NavMesh 빌드
- Window > AI > Navigation 창을 연다.
- 이동 가능한 바닥에 Navigation Static 체크를 한다.
- Bake 버튼을 눌러 NavMesh 데이터를 생성한다.
- NavMesh Agent 설정
- NPC 캐릭터에 NavMeshAgent 컴포넌트를 추가한다.
- 목표 지점까지 이동하도록 코드로 명령한다.
using UnityEngine;
using UnityEngine.AI;
public class EnemyAI : MonoBehaviour
{
public Transform target;
private NavMeshAgent agent;
void Start()
{
agent = GetComponent<NavMeshAgent>();
agent.SetDestination(target.position);
}
void Update()
{
if (Vector3.Distance(transform.position, target.position) > 1f)
{
agent.SetDestination(target.position);
}
}
}
- 움직이는 오브젝트에는 NavMeshObstacle을 붙이고 Carve 옵션을 활성화하면, 해당 오브젝트를 실시간으로 피하면서 경로를 갱신할 수 있다.
장점
- 자동화된 경로 탐색
복잡한 알고리즘을 직접 구현하지 않고도, AI가 최적 경로를 찾아 이동하도록 만들 수 있다. - 지형 인식 기반의 유연한 움직임
계단, 경사, 좁은 통로 등 다양한 환경에서도 자연스럽게 길을 찾는다. - 실시간 경로 갱신 가능
장애물이 새로 생기거나 움직여도, NavMeshObstacle과 Carve 기능으로 대응이 가능하다. - 에디터 친화적 환경
빌드 후 시각적으로 경로를 확인하고 수정할 수 있어 작업 속도가 빠르다.
한계 및 주의사항
- 높낮이가 심한 구조나 복층 구조에서는 단일 NavMesh로는 제한이 있을 수 있다. 이때는 NavMesh Link 또는 여러 NavMeshSurface를 조합하여 해결해야 한다.
- 비행체, 점프 이동, 수직 경로 탐색은 기본 NavMesh로는 구현되지 않는다. 별도의 커스텀 로직이 필요하다.
- 실시간 장애물 대응은 성능 부담이 있을 수 있다. Carve 옵션은 과도하게 사용하지 않도록 주의한다.
마무리
NavMesh는 유니티에서 AI 캐릭터의 이동을 구현하는 가장 표준적이고 안정적인 방법이다. 별도의 경로 탐색 알고리즘 없이도, NavMeshAgent를 통해 목적지까지 자연스럽게 이동하는 동작을 손쉽게 만들 수 있다. 특히 레벨 디자인이 고정된 게임에서는 빌드 한 번으로 매우 효율적인 경로 탐색 환경을 구축할 수 있다.
AI가 똑똑하게 보이게 만들고 싶다면, 우선은 NavMesh를 완벽하게 이해하고 활용하는 것부터 시작해야 한다.