Unity

[Unity] AI Navigation System 사용방법

CommitGuy 2024. 12. 11. 21:37

Unity의 AI Navigation System이 2.0 이상 버전으로 업그레이드 되면서 기존에 사용하던 방법과는 다르게 바뀌었다

이전 방법이 적힌 책이나 유튜브를 보면 도움이 되지 않으니 새로운 AI Navigation System을 사용하는 방법을 간단하게 소개합니다

 

1. Package Manager에서 AI Navigation Package 설치

AI Navigation Package 설치

Package Manager에서 Unity Registry 항목에 ai navigation을 검색하면 나온다 해당 패키지를 먼저 설치하자

필자의 경우 2.0.4 버전으로 설치하였다

 

2. NavMesh Surface 컴포넌트 추가

NavMesh Surface 컴포넌트는 NavMesh Agent가 걸을수 있는 영역을 만드는 컴포넌트입니다

NavMesh Surface 컴포넌트

빈 게임오브젝트를 하나 만들어 해당 오브젝트에 NavMesh Surface 컴포넌트를 추가한다

NavMesh Agent가 걸을 수 있는 영역을 Bake 해야 하는데 어떻게 걸을 수 있는 영역을 만들지는 Object Collection에서 정의한다

 

- All Game Objects는 활성화된 모든 게임오브젝트들을 걸을 수 있는 영역으로 만든다

- Volume은 오브젝트 구분 없이 지정한 육면체 범위 안쪽으로 영역을 만든다

- Current Object Hierarchy는 NavMeshSurface 컴포넌트가 들어있는 게임오브젝트의 하위 자식 오브젝트들을 대상으로 지정

- NavMeshModifier Component Only는 navmeshmodifier 컴포넌트를 가진 오브젝트만 지정

 

Volume으로 선택시 지정할 육면체

 

3. NavMesh Agent 컴포넌트 추가

NavMesh Agent는 NavMesh Surface로 걸어다닐 수 있게 만든 영역을 걸어다니게 만들어 주는 컴포넌트입니다

NavMesh Agent가 추가된 gameobject는 NavMesh Surface 위에 있어야 합니다

 

NavMesh Agent

 

NavMesh Agent를 추가하면 아래 사진과 같이 초록색 선으로 보이게 된다

NavMesh Agent 추가된 오브젝트

초록색 선으로 보인다고 해서 Collider효과를 가지게 되는것은 아니다(Collider를 추가했을때와 같은 색상으로 보이다 보니 오해할 수 있다)

그러니 Collider 효과를 원한다면 Collider를 따로 추가해주어야 한다

NavMesh Agent가 추가된 컴포넌트에 rigidbody를 추가한다면 iskinematic을 설정해줘야 움직임을 관리하는 NavMeshAgent와 충돌을 피할 수 있습니다

 

4. 목표 위치로 이동하는 코드

using UnityEngine;
using UnityEngine.AI;

[SerializeField] private Transform target;

private NavMeshAgent agent;

private void Start()
{
    agent.SetDestination(target.position);
}

 

NavMeshAgent의 SetDestination 함수에 이동시키고자 하는 Vector3 Type의 위치를 넣으면 그 위치로 이동한다

 

5. 여러 위치를 순차적으로 이동하는 코드

using UnityEngine;
using UnityEngine.AI;

[SerializeField] private Transform[] agentTarget;

private NavMeshAgent agent;
private int index = 0;

private void Start()
{
    FindOtherTarget();
}

private void Update()
{
    if (agent.pathStatus == NavMeshPathStatus.PathComplete
        && agent.remainingDistance - agent.stoppingDistance < 0.1f)
    {
        FindOtherTarget();
    }
}

private void FindOtherTarget()
{
    if (index < agentTarget.Length)
    {
        agent.SetDestination(agentTarget[index].position);
    }

    index++;
}

 

NavMeshAgent의 NavMeshPathStatus 상태를 통해 목표하는 지점으로의 이동이 끝난지와 남은 거리 계산을 통해 이 값이 0.1 이하라면 목표하는 위치에 도달했다고 보고 그 다음 위치로 SetDestination 함수를 호출해 다시 재이동한다