저번에 이어서 네비게이션 이야기를 해보자.
네이게이션을 구웠다면, 오늘은 구운 빵위에서 춤춰보자.
AI로 움직일 대상에 NavMeshAgent
컴포넌트를 달아주자.
컴포넌트의 구성요소가 덕지덕지 붙어있는데 한번 살펴보자.
Agent Type
: 구운 NavMesh의 Agent 타입Baset Offset
: 충돌 실린더의 Y축 위치Speed
: 에이전트의 이동 속도Angular Speed
: 에이전트의 회전 속도 (Degree / second)Acceleration
: 최고 이동속도 까지의 시간Stopping Distance
: 목적지와 일정 거리가 되면 멈추는데 그 거리Auto Braking
: 목적지에 도달 전에 감속할 것인지. true면 딱 그자리에 멈추지만, false라면 자기 속도 감당 못하고 지나쳐버려서 왔다갔다 거림.Radius
: 밀어낼 범위Height
: 밀어내는 높이Quality
: 밀어내는 정도. High에서 Low로 갈수록 상남자식 밀치기를 보여준다. 양쪽 다 None이면 뚫고 지나가버린다.Priority
: 에이전트 간의 우선순위. 0(Max) ~ 99(Min). 상대의 우선순위가 낮을수록 상대적 상남자가 되어 밀고 지나가버린다. 반면에 낮은 친구는 높은 친구를 밀어내지 못하는 하남자가 된다.Auto Repath
: NavMesh에 변동이 있을 때 자동으로 길을 다시 찾을까 ?Area Mask
: 지나갈 수 있는 영역 설정여기까지는 인스펙터 창에서도 확인할 수 있는 변수들이고, 아래는 스크립트를 작성할 때 유용한 것들에 대해 ARABOZA.
remainingDistance
: 현재 경로에서 목표 지점까지 남아있는 거리desiredVelocity
: 목적지로 향하는 목표 속도. (실제 속도는 아님)isStopped
: true면 정지, false면 움직임enabled
: false면 NavMeshAgent 컴포넌트 비활성화, false면 AI 추적을 종료하고 이제는 메소드에 대해 ARABOZA.
bool SetDestination(Vector3 target)
: target 위치까지 최단 경로를 찾아 이동시키는 메소드.
- 목적지를 바라보도록 자동으로 회전시킨다.
- Speed
와 AngularSpeed
의 값 사용.
- 올바른 요청이면 true, 아니면 false를 반환한다.
- ※ Rigidbody보다 NavMeshAgent가 우선시 되기 때문에, Rigidbody의 함수들이 먹히질 않게 되는 점을 주의하자.
void Move(Vector3 offset)
: offset만큼 이동하는 메소드.
- NavMesh로 구워진 경로 내에서만 이동할 수 있다.
void ResetPath()
: 현재 경로를 취소하고 멈춘다.
bool CalculatePath(Vector3 targetPosition, NavMeshPath path)
: NavMeshAgent의 위치로부터 목적지 targetPosition까지 최단 경로를 계산하고, NavMeshPath 타입의 데이터path에 최단 경로의 코너 부분의 위치 벡터를 배열로 저장한다.
- 전에 NevMeshPath path = new NavMeshPath()
를 선언해주자.
- 목적지에 갈 수 있으면 true, 아니면 false를 반환한다.
- 저장은 path.corners에 Vector3 배열로 저장된다.