[새로 배운] navMesh

가이등·2022년 9월 19일
0

John Lemon 프로젝트

목록 보기
3/8

이 글은 다음의 내용을 참고하여 작성하였습니다.


⚡ navMesh란

navMesh란 네비게이션 메쉬의 줄임말로, 게임 월드에서 걸어다닐 수 있는 구역을 설정하고 다룰 수 있게 해주는 유니티 빌트인 시스템이다.

사진에서 보이듯 4개의 컴포넌트로 구성된다. 자세한 내용은 여기에서.


⚡ John Lemon 프로젝트에서 navMesh 적용

John Lemon 프로젝트에는 2가지의 적이 있다.

1. 움직이지 않는 Gargoyle
2. 특정 포인트를 순회하는 Ghost

navMesh는 이 중 Ghost 의 움직임 구현에 사용된다.


⚡ 내비메쉬 빌드

내비메쉬는 정적(static)으로 표시된 메시 렌더와 모든 게임 오브젝트 정보를 수집한 후 처리하여 생성된다.

따라서 내비메쉬를 설정할 맵 오브젝트는 모두 static으로 바꾸어 주어야 한다.

Window > AI > Navigation 에 들어가면 Navigation 창이 활성화된다.

설정을 만지고 우측 하단의 Bake 버튼을 클릭하면 내비메쉬가 설정된다.


⚡ Ghost 오브젝트에 NavMeshAgent 컴포넌트 적용

Ghost 오브젝트에 navMeshAgent 컴포넌트를 넣는다.

이 중 Stopping Distance는 처음에 0으로 설정되어 있는데, 해당 값을 늘리면

Nav Mesh Agent가 목적지 근처에 있더라도 완전히 도착했다고 인식하는 거리를 늘릴 수 있다.


⚡ Ghost 오브젝트에 스크립트(WayPointPatrol) 적용

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문이 의도대로 동작할 수 있다.


⚡ WayPoint 생성 및 적용

빈 오브젝트를 원하는 만큼 생성한 후, Ghost가 순회할 Point에 위치시킨다.

이때 빈 오브젝트가 생성된 navMesh 범위 안에 위치하는지 확인해야 한다.
▲1번째 wayPoint

▲2번째 wayPoint

작성한 스크립트를 Ghost에 적용한 후, WayPoints 배열에 생성한 오브젝트들을 등록한다.



⚡ 결과


WayPoint를 여러 개 등록하면 다양한 패턴을 만들 수도 있다. ‡

profile
안녕하세요구르트

0개의 댓글