navMesh란 네비게이션 메쉬의 줄임말로, 게임 월드에서 걸어다닐 수 있는 구역을 설정하고 다룰 수 있게 해주는 유니티 빌트인 시스템이다.
사진에서 보이듯 4개의 컴포넌트로 구성된다. 자세한 내용은 여기에서.
John Lemon 프로젝트에는 2가지의 적이 있다.
1. 움직이지 않는 Gargoyle
2. 특정 포인트를 순회하는 Ghost
navMesh는 이 중 Ghost 의 움직임 구현에 사용된다.
내비메쉬는 정적(static)으로 표시된 메시 렌더와 모든 게임 오브젝트 정보를 수집한 후 처리하여 생성된다.
따라서 내비메쉬를 설정할 맵 오브젝트는 모두 static으로 바꾸어 주어야 한다.
Window > AI > Navigation 에 들어가면 Navigation 창이 활성화된다.
설정을 만지고 우측 하단의 Bake 버튼을 클릭하면 내비메쉬가 설정된다.
Ghost 오브젝트에 navMeshAgent 컴포넌트를 넣는다.
이 중 Stopping Distance는 처음에 0으로 설정되어 있는데, 해당 값을 늘리면
Nav Mesh Agent가 목적지 근처에 있더라도 완전히 도착했다고 인식하는 거리를 늘릴 수 있다.
public class WayPointPatrol : MonoBehaviour {
public NavMeshAgent navMeshAgent;
public Transform[] wayPoints;
int currentWayPointIndex = 0;
void Start() {
navMeshAgent.SetDestination(wayPoints[0].position);
}
public void Move() {
if (navMeshAgent.remainingDistance < navMeshAgent.stoppingDistance) {
currentWayPointIndex = (currentWayPointIndex + 1) % wayPoints.Length;
navMeshAgent.SetDestination(wayPoints[currentWayPointIndex].position);
}
}
}
navMeshAgent.SetDestination(Vector3 position)
//position 벡터 위치를 목적지로 설정한다. Agent는 목적지를 향해 이동한다.
navMeshAgent.remainingDistance
//Agent의 현재 위치에서 Destination까지 남은 거리를 계산하여 리턴한다.
navMeshAgent.stoppingDistance
//위에서 설정했던 NavMeshAgent 컴포넌트의 Stopping Distance 값을 리턴한다.
먼저 Transform[] 배열 wayPoints를 만든다.
처음 게임이 실행되었을 때, Start() 에서 첫번째 wayPoint를 목적지로 설정한 후,
remainingDistance < stoppingDistance가 될 때, 다음 wayPoint를 목적지로 변경한다.
배열의 마지막 wayPoint에 도달하면 다시 첫번째 wayPoint가 목적지로 설정된다. (% 연산으로 인해)
Move() 함수는 다른 스크립트의 Update() 에서 호출되므로 if문이 의도대로 동작할 수 있다.
빈 오브젝트를 원하는 만큼 생성한 후, Ghost가 순회할 Point에 위치시킨다.
이때 빈 오브젝트가 생성된 navMesh 범위 안에 위치하는지 확인해야 한다.
▲1번째 wayPoint
▲2번째 wayPoint
작성한 스크립트를 Ghost에 적용한 후, WayPoints 배열에 생성한 오브젝트들을 등록한다.
WayPoint를 여러 개 등록하면 다양한 패턴을 만들 수도 있다. ‡