[TIL] Unity - NavMesh 2D

MINO·2024년 6월 27일
0
post-thumbnail

2024-06-27

신기록 갱신


NavMesh

쉽게 말해 네비게이션 시스템으로,
유저가 조작하는 캐릭터가 아닌 몬스터, NPC 같은 존재가
최단 경로를 찾아 목적지에 도달하게 해준다.


Unity 3D 에서 기본적으로 제공하는 네비게이션 기능이다.

최근 패키지 매니저를 통해 설치하고 업데이트할 수 있는 AI Navigation 2.0 등장하여,
더욱 향상된 유연성과 사용자 제어를 제공한다.
Youtube - AI Navigation 2.0


  • NavMesh : 걸을 수 있는 표면
  • NavMesh Agent : 각자 목적지로 이동하는 동안 서로를 피할 수 있는 캐릭터
  • Off-Mesh Link : 배수로나 울타리를 뛰어넘는 행위를 정의
  • NavMesh Obstacle : 에이전트가 월드를 탐색하는 동안 회피해야 하는 움직이는 장애물

NavMesh 2D

2D 의 경우, Unity 에서 공식으로 지원되는 기능이 없고
유저가 만든 플러그인 NavMeshPlus 를 활용할 수 있다.


플러그인 적용 방법

  1. GitHub - NavMeshPlus -> Code -> Download ZIP

  1. 다운로드 받은 ZIP 의 압축을 풀고, NavMeshComponents 폴더를 프로젝트의 Assets 로 이동

결과

새로 추가된 Navigation 관련 컴포넌트를 사용할 수 있다.


튜토리얼

사전 세팅

타일맵으로 간단하게 맵을 찍은 뒤,
Target 과 해당 Target 을 향해 이동할 Monster 를 생성해준다.

초록색 타일은 Ground, 갈색 타일은 Walls, 파란색 타일은 Water 이고,
Walls 와 Water 타일은 Agent 가 이동할 수 없는 지역이다.


NavMesh 로 사용할 빈 오브젝트를 생성하고,
Navigation Surface 스크립트와 Navigation CollectSource2d 스크립트를 추가한다.


Tile 설정

이전에 언급하였듯이, Ground 만 Walkable , Walls 와 Water 는 Not Walkable 으로 설정해준다.

GroundWaterWalls

Monster, Target 설정

몬스터와 타겟을 각각 맵 위에 위치시키고,
몬스터에는 Nav Mesh Agent 컴포넌트와 행동을 나타낼 Monster.cs 스크립트를 추가한다.

using UnityEngine;
using UnityEngine.AI; // Nav Mesh 를 사용하기 위해 필요한 using 문

public class Monster : MonoBehaviour
{
    [SerializeField] Transform target; // 따라갈 타겟

    NavMeshAgent agent; // 탐색 메시 에이전트에 대한 참조가 필요

    void Start()
    {
        agent = GetComponent<NavMeshAgent>();
        agent.updateRotation = false; // Agent 가 Target 을 향해 이동할 때 방향을 회전할지
        agent.updateUpAxis = false; // 캐릭터의 이동을 평면으로 제한하기 위해
    }

    void Update()
    {
        agent.SetDestination(target.position); // Agent에게 target의 현재 위치로 이동하도록 지시
    }
}

이후, Monster 오브젝트의 Monster 컴포넌트의 Target 을 드래그&드롭 하여 설정해준다.


Bake

NavMesh - Navigation Surface - Bake 를 통해
Agent 가 이동할 수 있는 경로를 지정해준다.


Bake 클릭Scene

결과물

Monster 오브젝트 (흰색 Circle) 은 Target 오브젝트 (검은색 Circle) 을 향해 이동한다.


참고

Youtube - TileMap PathFinding, Unity AI
GitHub - NavMeshPlus


TIL 마무리

최종 프로젝트에서 몬스터의 이동 및 구현을 담당하게 되었다.
FSM 과 NavMesh2D 를 통해 구현하는 것을 목표로 하여
주말동안 FSM 을 공부해보고 적용해봐야겠다.

profile
안녕하세요 게임 개발하는 MINO 입니다.

0개의 댓글