유니티의 Ai Navigation은 NPC가 게임 환경에서 효율적으로 이동할 수 있게 해주는 기능이다.
Ai Navigation를 사용하기 전에 먼저 유니티 패키지에서 AI Navigation의 설치가 필요하다
Ai Navigation을 설치하면 씬 창에 위 사진과 같이 나온다 여기서 NavMesh를 체크하고 Bake를 누르면
위 사진과 같이 다른 색상이 씬창에 나오는 것을 볼 수 있다. 색이 다르게 표현된 부분은 이동이 가능한 부분이고 그 바깥 부분은 이동이 불가능한 영역이다. 이것을 사용하면 NPC들은 이동이 불가능한 부분까지 이동하려고 하지 않는다.
Ai Navigation를 설치하고 NavMesh를 활용하려면 NPC에게 NavMesh Agent라는 컴포넌트가 필요하다 이 컴포넌트는 속도 등과 같은 이동과 범위등의 기능을 가지고 있다.
using UnityEngine;
using UnityEngine.AI;
public class AgentController : MonoBehaviour
{
//타겟 위치
public Transform target;
// NavMeshAgent 가져오기
private NavMeshAgent agent;
void Start()
{
agent = GetComponent<NavMeshAgent>();
// agent의 내부 함수인 도착점에 도착점 전달
agent.SetDestination(target.position);
}
void Update()
{
// 도착점으로 이동
if (Vector3.Distance(agent.destination, target.position) > 1.0f)
{
agent.SetDestination(target.position);
}
}
}
여기서 도착점까지 이동하는데 어떤 장애물이 있던 이것은 따로 코드로 작성해줄 필요 없이 NavMesh에서 처리해준다.
NavMesh는 복잡한 경로 알고리즘을 직접 구현할 필요 없이, NavMesh을 사용해 간단하게 경로 찾기를 구현할 수 있다. 또 장애물을 자동으로 감지하고 피하는 경로를 계산해 충돌 없이 이동이 가능하며, 이러한 기능에도 불구하고 내부적으로 최적화 되어 있어 성능에 큰 부담을 주지 않는다는 특징을 가지고 있따
또 평면 뿐만 아니라 곡면, 계단, 경사로와 같은 다양한 환경에서도 동작이 가능해 많은 범위에서 사용이 가능하다.
기존에 탑다운 슈팅게임을 만들 때 적들의 이동을 일일이 코드로 작성했던 기억이 있다. 한참을 코드로 작성하다가 이런 식으로 하는 것 보다 그냥 애니메이션 처리가 낫지않았나라고 후회했던 기억이 있다.
그때 만들던건 2D프로젝트여서 사용하지는 못하겠지만 이런 기능을 미리 알았으니 복잡한 이동 로직을 직접 작성할 필요가 없다는 점이 다행이라는 생각이 든다.
수치나 다른것들도 어느 정도 직접 조절할 수 있어서 범용성이 좋다고 생각했다. 또 이걸 잘 이용하면 FPS에서 적들의 움직임을 제어하는데 도움이 될거라고 생각했다. 직접 만들어 볼 일이 생긴다면 좀 더 복잡한 로직들을 고민해봐야겠다.