# NavMesh(네비 메쉬)

# NavMesh(네비 메쉬)

# 네비 메쉬 (Navigation Mesh)

네비 메쉬(NavMesh)란 두 점 사이의 최적의 경로를 탐색하는 유니티의 대표적인 AI 알고리즘 이다.

보통, 게임상의 공간은 3D 공간으로 구성되어 있지만, 2D로 변경해 모든 공간을 삼각형으로 이루어진

Mesh로 구성하고 난 후 최적의 경로를 탐색한다. 이를 네비 메쉬(NavMesh)라고 한다.

이용 되는 예시로는, 몬스터 AI와 같이 길을 탐색할 경우, 장애물 회피할 때가 있다.

# Nav Mesh Agent

NavMesh(네비 메쉬) 기능을 이용하기 위해서는 이 기능을 이용하려는 오브젝트에 Nav Mesh Agent를 넣어줘야한다.

프로퍼티기능

에이전트 크기 Radius 에이전트의 반경은 장애물과 다른 에이전트 간의 충돌 계산하기 위해 사용됩니다. Height 에이전트가 장애물 밑으로 지나갈 수 있는 높이 간격입니다. Base offset 트랜스폼 피봇 포인트와 관련한 충돌 실린더의 오프셋입니다. 스티어링 Speed 최대 이동 속도(초당 월드 단위로) Angular Speed 최대 회전 속도(초당 각도) Acceleration 최대 가속(제곱 초당 월드 단위로) Stopping distance 에이전트는 목표 위치에 가까워졌을 시 정지합니다. Auto Braking 활성화 시 에이전트는 목적지에 다다를 때 속도를 줄입니다. 에이전트가 멀티플 포인트 사이에서 부드럽게 움직여야 하는 순찰과 같은 동작을 할 때에는 반드시 비활성화 시켜야 합니다. 장애물 회피 Quality 장애물 회피 품질입니다. 에이전트의 수가 많다면 장애물 회피 품질을 줄임으로써 CPU 시간을 절약할 수 있습니다. 회피를 없음으로 설정할 경우 충돌만 해결할 수 있을 뿐 다른 에이전트와 장애물에 대한 적극적인 회피는 하지 않습니다. Priority 낮은 우선 순위의 에이전트는 이 에이전트의 회피 대상에서 제외됩니다. 값은 0에서 99사이에서 설정되어야 하며 낮은 숫자가 높은 우선 순위임을 의미합니다. 경로 찾기 Auto Traverse OffMesh Link 자동적으로 오프 메시 링크를 횡단하려면 트루로 설정해야 합니다. 애니메이션을 사용하거나 오프메시 링크를 횡단하는 특정한 방법을 사용하고 싶다면 반드시 이를 꺼놔야 합니다. Auto Repath 활성화 시 에이전트가 경로 일부분의 끝에 도달하면 경로를 재탐색 합니다. 목적지까지 경로가 없다면 목적지에서 제일 가깝게 도달할 수 있는 위치까지 부분적인 경로가 생성됩니다. Area Mask 영역 마스크는 에이전트가 경로 탐색에 어떠한 영역 타입을 고려할 것인지를 설명합니다. 내비메시 베이킹를 위해 메시를 준비할 때 각각의 메시 영역 타입을 설정할 수 있습니다. 예를 들어 계단을 특별한 영역 타입으로 표시하고 몇몇 캐릭터 타입의 계단 이용을 금지할 수 있습니다.

[출처 : Unity Documentation]

# 네비 메쉬(NavMesh)를 직접 구현해 보자.

1. window -> AI -> Navigation

Bake -> Bake 버튼 클릭.

2. Player에 Navi Mesh Agent Component 추가

3. Nav 스크립트 생성

4. 생성한 스크립트 Player에 넣기.

using System.Collections; using System.Collections.Generic; using UnityEngine.AI; // 유니티에서 제공하는 AI 기능을 이용하기 위한 코드. using UnityEngine; public class Navigation : MonoBehaviour { public GameObject Player; // 플레이어. public GameObject Enemy; // 몬스터. private Transform _transform; // 위치 값. private Transform MonsterTransform; // 몬스터 위치 값. private NavMeshAgent nvAgent; // 네비 메쉬 변수. void Start() { Navi(); // 길찾기 함수 호출. } public void Navi() { _transform = this.gameObject.GetComponent(); // 플레이어 위치를 _transform 변수에 담는다. MonsterTransform = GameObject.FindWithTag("Monster").GetComponent(); // MonsterTransform = 태그가 몬스터인 오브젝트를 검색해 타켓의 위치 값을 변수에 넣어둔다. nvAgent = this.gameObject.GetComponent(); // 플레이어에 네비 메쉬 기능을 넣어준다. nvAgent.destination = Enemy.transform.position; // 몬스터의 위치 값을 받아 목적지를 지정한다. } }

from http://ditodghk96.tistory.com/3 by ccl(A) rewrite - 2021-07-14 17:00:53