1. NavMeshPlus 설치 (2D 전용)

Unity 기본 내비게이션 시스템은 3D 기준입니다.
2D에서도 NavMesh를 사용하려면 다음 외부 패키지를 설치해야 합니다.

이를 해결해주는 도구가 바로 NavMeshPlus입니다.

 

설치 방법 (Git URL)

  1. Unity 메뉴 → Window > Package Manager
  2. 왼쪽 상단 ⊕ 버튼 → Add package from Git URL... 선택
  3. 아래 주소 입력 후 설치:
https://github.com/h8man/NavMeshPlus.git
설치되면 NavMeshSurface2d, NavMeshAgent, NavMeshModifier 등을 사용할 수 있습니다

 

2. NavMeshSurface2D 설정

 

빈 GameObject 생성, Navigation Surface, Navigation CollectSources2d 추가 후 Rotate Surface to XY 클릭

NavMesh는 3D(XZ축)를 기준으로 구워지기 때문에 이것을 2D에서는 XY 평면으로 회전시켜야 정상적으로 작동합니다.

 

3. 기본 타일맵 설정

모양은 자유, Ground, Wall, Water로 구분됨

NavMeshModifier로 영역 설정

 

각 타일 오브젝트에 Navigation Modifier 를 추가해 경로 탐색이 가능한 곳, 불가능한 곳을 나누어 각각 설정합니다.

이후 Navigation Surface에서 Bake를 진행합니다.

그럼 이렇게 스프라이트를 기준으로 NavMesh가 구워집니다.

만약 스프라이트가 아닌 Collider 2D를 기준으로 Bake하려면

NavMeshSurface에서 Use Geometry 옵션을 Physics Collider로 바꾸면 됩니다.

4. 캐릭터에 NavMeshAgent 추가

AI로 이동할 대상(예: Enemy, Player)에 NavMeshAgent 컴포넌트 추가

 

필수 설정

항목 설명
updateRotation = false 2D 스프라이트가 불필요하게 회전하는 것을 방지
updateUpAxis = false 2D는 Z축이 위가 아니므로, XY 평면 기준으로 설정
agent.updateRotation = false;
agent.updateUpAxis = false;

 

▶ 마우스 클릭 이동 예시

using UnityEngine;
using UnityEngine.AI;

public class PlayerMove2D : MonoBehaviour
{
    private NavMeshAgent agent;

    void Start()
    {
        agent = GetComponent<NavMeshAgent>();
        agent.updateRotation = false; // 스프라이트 회전 방지
        agent.updateUpAxis = false; // XY 평면 기준 이동
    }

    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            Vector2 mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
            agent.SetDestination(mousePos);
        }
    }
}

 

▶ 타겟 추적 (예: 몬스터가 플레이어 추격)

using UnityEngine;
using UnityEngine.AI;

public class EnemyChase2D : MonoBehaviour
{
    public Transform target;
    private NavMeshAgent agent;

    void Start()
    {
        agent = GetComponent<NavMeshAgent>();
        agent.updateRotation = false;
        agent.updateUpAxis = false;
    }

    void Update()
    {
        if (target != null)
        {
            agent.SetDestination(target.position);
        }
    }
}

 

 

+ Recent posts