내브메쉬(Navmesh)와 경로찾기(Pathfinding)

네브 메쉬(일명 Navmesh, 탐색 메쉬)는 월드 기하구조(geometry)의 축소판으로, 게임플레이 에이전트가 월드를 탐색하는 데 사용함. 일반적으로 에이전트는 경로를 통해 찾으려고 하는 goal이나 destination이 있는데, 그 경로를 따라 목표까지 탐색함. 이 과정을 경로찾기(pathfinding)이라고 함. 주목할 것은, 네브메쉬의 생성(Navmesh generation, 혹은 baking)은 개발자에 의해 편집기 내에서 이루어지는 반면, pathfinding은 그 네브메쉬를 바탕으로 에이전트에 의해서 실행 중에 이루어진다.

씬이 변경되었다면, 네비게이션매쉬는 다시 구워져야한다(Bake).

게임의 복잡한 월드에는 많은 에이전트와 동적인 장애물이 있을 수 있고, 월드 내에 여러 영역에 대해 접근성 레벨이 끊임없이 바뀌기도 함. 에이전트는 이러한 변화에 동적으로 대응하여야 함. 한 에이전트의 경로찾기 작업은 다른 인물과의 충돌 피하기, 지형의 성질 변화, 물리적 장애물(닫히는 도어 등), 그리고 실제 목적지의 업데이트 등에 의해 방해 받거나 영향을 받게 된다.

다음은 네브메쉬(navmesh)을 설정하고 에이전트가 이에 기반하여 경로찾기를 하는 예제임:

  • 이 레벨에서 PlaneTerrain 같은 기하구조(geometry)을 생성함. Plane or a Terrain.
  • 인스펙터(Inspector)에서 창의 오른쪽 코너에 있는 Static을 클릭하고 기하구조가 Navigation Static으로 마크 업(marked up) 되었는지 확인함.

  • Navigation Mesh 창을 띄웁니다(WindowNavigation).
  • Bake the mesh. 이렇게 하면 모든 navigation-static 기하구조에 대한 네브메쉬를 생성함.
  • 씬(scene)에서 몇 개의 동적 기하구조를 생성함(예: 인물).
  • 에이전트를 하나 설정하고 (혹은 여러 개), 씬(scene)에서 NavMeshAgent 컴포넌트를 동적 기하구조에 추가하여,
  • 에이전트에 부착된 스크립트에서 에이전트에 목적지를 부여함 (destination속성을 설정함으로써)
  • Play을 누르고 마법을 관람함.

사용자만의 NavMesh layers을 정의하는 것도 가능함을 주목하십시오. 이는 한 부분의 환경이 다른 부분보다 지나가기가 용이한 상황에서 필요함. 바로 연결하지 않은 메쉬의 일부분에 대해, Off Mesh Links을 생성하는 것도 가능함.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class Enemy : MonoBehaviour {
 
    public GameObject target;
    UnityEngine.AI.NavMeshAgent agent;
 
    // Use this for initialization
    void Start () {
        agent = GetComponent<UnityEngine.AI.NavMeshAgent>();
    }
 
    // Update is called once per frame
    void Update () {
        agent.destination = target.transform.position;
    }
}

자동 오프메쉬(off-mesh) 링크

네브메쉬 기하구조는 자동 오프메쉬(off-mesh)링크 생성에도 마크 업 될 수 있다:

자동 오프 메쉬 링크 생성에 대한 기하구조의 마크 업

이러한 방법으로 마크 업 된 기하구조는 다른 네브메쉬 기하구조로의 링크를 생성하는 Navmesh Baking 과정에서 체크 될 것 임. 이런 방법으로, 각 게임오브젝트(GameObject)의 자동 생성을 제어할 수 있다. 오프 메쉬 링크가 베이킹 과정에서 자동생성인지의 여부는 Navigation Bake 설정에서 Jump distanceDrop height 속성에서 결정된다.

자동 생성 오프 메쉬 링크에 할당된 NavMeshLayer는 내장 레이어(built-in layer) Jump 임. 이는 자동 생성 오프 메쉬 링크의 비용을 전체적으로 관리할 수 있게 해 준다(Navmesh layers 참조).

수동으로 오프 메쉬 링크를 설정하는 것 역시 가능함을 주목하십시오(here에 설명 참조).

역링크