NavMesh를 이용하여 길을 탐색할 때 기본 설정으로하면 좁은 길이라도 통과하게 된다.
이때 특정 폭 이상이 될 경우에만 이동하는 예제를 만들어본다.
예) 자동문등이 일정이상 열렸을 경우에만 통과

목표로 이동할 에이전트의 타입 설정을 다음과 같이한다.
주요 포인트는 Radius로 에이전트가 길을 지나갈 때 필요한 폭이 된다.
이때 반지름이 2이므로 4의 폭이 필요하다.

그렇기에 위와 같이 양옆의 좁은 길은 움직일 수 있는 범위가 좁다.
가운데 길과 같이 일부의 폭만 있는 길은 갈 수 없는 상태가 된다.

가운데의 장애물을 움직여 지나갈 수 있는 폭이 반지름보다 커지면 지나갈 경로가 생긴다.

NavMesh의 Obstacle은 모든 에이전트가 피하는 장애물이다.
이때 주요 옵션은 다음과 같다.
using UnityEngine;
using UnityEngine.AI;
public class AIPathFinder : MonoBehaviour
{
[SerializeField] private Transform target;
private NavMeshAgent agent;
private Renderer _renderer;
// Start is called before the first frame update
void Start()
{
agent = GetComponent<NavMeshAgent>();
_renderer = GetComponent<Renderer>();
}
// Update is called once per frame
void Update()
{
NavMeshPath path = new NavMeshPath();
agent.CalculatePath(target.position, path);
if (path.status != NavMeshPathStatus.PathComplete)
{
Debug.Log("경로 없음");
_renderer.material.color = Color.red;
agent.ResetPath();
}
else
{
Debug.Log("경로 발견");
_renderer.material.color = Color.green;
agent.SetDestination(target.position);
}
}
위 코드는 다음과 같이 작동한다.
경로를 탐색하여 경로가 완전히 이동 가능한지를 파악한다.
만약 경로가 완전하면 색깔을 초록색으로 바뀌고 타겟의 추적을 시작한다.
만약 길이 없거나 중간에 끊겨 있다면 빨간 색으로 바뀌고 경로를 다시 탐색한다.
경로의 상태는 다음과 같이 NavMeshPath를 통해 확인한다.
NavMeshPath path = new NavMeshPath();
agent.CalculatePath(target.position, path);
if (path.status != NavMeshPathStatus.PathComplete)
움직이는 장애물(벽)이 움직이는 동안에도 길을 막는 역할을 하고
에이전트는 이동할 수 있는 폭이 있는 경로를 탐색한다.
