Unity NavMesh를 활용한 AI 경로 찾기

2024. 12. 23. 03:39Unity

Unity NavMesh를 활용한 AI 경로 찾기

NavMesh는 Unity에서 제공하는 내장 경로 찾기 시스템으로, AI 캐릭터가 지형을 탐색하고 목표 지점까지 효율적으로 이동할 수 있도록 돕습니다. 이번 포스팅에서는 NavMesh의 기본 개념, 설정 방법, 그리고 AI 경로 찾기 구현 방법을 알아보겠습니다.


1. NavMesh란?

NavMesh(Navigation Mesh)는 3D 공간에서 AI가 이동할 수 있는 영역을 나타내는 데이터 구조입니다.

  • NavMesh Agent: NavMesh 위에서 이동하는 AI 캐릭터.
  • NavMesh Obstacles: 장애물을 정의하여 AI의 이동 경로를 제어.

주요 기능:

  • AI 캐릭터의 경로 탐색.
  • 장애물을 우회하는 동적 경로 계산.
  • 지형에 따라 자동으로 길을 생성.

2. NavMesh 설정

1) NavMesh 생성

  1. Window > AI > Navigation을 클릭하여 Navigation 창을 엽니다.
  2. Scene 창에서 AI가 이동할 수 있는 지형을 선택합니다.
  3. Navigation 창에서 Bake 탭으로 이동하여 Bake 버튼을 클릭합니다.
    • 선택한 지형이 NavMesh로 변환됩니다.
    • Agent Radius, Height 등을 조정해 세부 설정을 변경할 수 있습니다.

2) NavMesh Agent 추가

  1. AI 캐릭터가 될 GameObject를 선택합니다.
  2. Inspector > Add Component > NavMesh Agent를 추가합니다.
  3. NavMesh Agent의 속성을 조정합니다:
    • Speed: 이동 속도.
    • Angular Speed: 회전 속도.
    • Stopping Distance: 목표 지점에 도달 후 멈추는 거리.

3) NavMesh Obstacles 추가

  1. AI 경로를 차단할 GameObject를 선택합니다.
  2. Inspector > Add Component > NavMesh Obstacle을 추가합니다.
  3. Carve 옵션을 활성화하여 장애물이 NavMesh에 영향을 미치도록 설정합니다.

3. 스크립트를 통한 경로 찾기

1) 목표 지점 설정

AI가 이동할 목표 지점을 지정합니다.

using UnityEngine;
using UnityEngine.AI;

public class AIController : MonoBehaviour
{
    public Transform target; // 목표 지점
    private NavMeshAgent agent;

    void Start()
    {
        agent = GetComponent<NavMeshAgent>();
        agent.SetDestination(target.position); // 목표 지점으로 이동
    }

    void Update()
    {
        if (agent.remainingDistance <= agent.stoppingDistance)
        {
            // 목표 지점에 도달했을 때의 행동
            Debug.Log("목표 지점에 도달");
        }
    }
}

2) 동적 목표 변경

플레이어의 위치 등 동적으로 변경되는 목표 지점에 AI를 이동시킬 수 있습니다.

void Update()
{
    if (target != null)
    {
        agent.SetDestination(target.position); // 목표 위치를 실시간으로 업데이트
    }
}

 


4. 장애물 우회 및 동적 경로 설정

1) NavMesh Obstacle 활용

장애물로 지정된 GameObject는 AI의 경로에 영향을 주어, AI가 이를 우회하도록 만듭니다.

  • Carve를 활성화하면 NavMesh가 장애물을 중심으로 동적으로 재계산됩니다.

2) NavMesh Link 활용

높은 곳이나 단차를 넘어서 이동해야 하는 경우 NavMesh Link를 추가합니다.

  1. GameObject > AI > NavMesh Link를 선택하여 링크를 생성합니다.
  2. 링크의 시작(Start)과 끝(End) 위치를 설정합니다.

5. NavMesh의 확장 기능

1) 동적 NavMesh 업데이트

NavMesh가 실시간으로 변경되어야 하는 경우 NavMesh Surface를 사용합니다.

  1. NavMesh Components 패키지를 설치합니다.
    • Package Manager에서 "NavMesh Components"를 검색하여 설치.
  2. 이동할 지형에 NavMesh Surface를 추가하고 설정합니다.
  3. 스크립트를 통해 동적으로 NavMesh를 갱신할 수 있습니다.
using UnityEngine.AI;

public class DynamicNavMesh : MonoBehaviour
{
    public NavMeshSurface surface;

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            surface.BuildNavMesh(); // NavMesh 재생성
        }
    }
}

2) AI 행동 추가

경로 탐색 외에도 AI 행동을 추가하여 더욱 생동감 있는 게임플레이를 구현할 수 있습니다.

  • 추적(Chase): 플레이어를 따라가도록 설정.
  • 도망(Flee): 특정 조건에서 목표로부터 멀어지도록 설정.

6. 요약

Unity NavMesh를 활용하면 AI 경로 탐색과 장애물 회피를 손쉽게 구현할 수 있습니다.

  • NavMesh Bake로 AI가 이동 가능한 영역 생성.
  • NavMesh AgentObstacle을 활용해 동적 경로 계산.
  • 스크립트를 통해 목표 지점을 제어하고 동적 환경에 대응.