과거엔 직접 로직을 작성하여 오브젝트가 스스로 움직이는 것을 구현하였다면 지금은 그럴필요없이 유니티에서 제공하는 AI 네비게이션을 사용하여 구현하는 것이 더 효율적이라고 합니다.
AI 네비게이션을 사용하기 위해선 먼저 패키지를 다운 받아줍니다.
패키지 설치가 완료 되었다면 Windows 창에 AI항목이 새로 나타나게 됩니다. 여기서 Navigation (Obsolete) 를 클릭
제 경우엔 인스펙터창 옆에 새로 탭이 생겼습니다. 일단 먼저 간단하게 살펴보자면
Agents 는 움직이는 오브젝트에 붙이는 것
Areas 는 지형에 대한 레이어를 설정
Object에서 이러한 지형 지물에 대한 레이어를 설정해줄 수 있다.
bake 창에사 지형을 대상으로 bake를 하게 되면 움직일 수 있는 곳은 파란색으로 설정되게 됩니다.
이제 오브젝트에 붙이는 컴포넌트를 살펴봅니다.
Nav Mesh Obstacle은 해당 오브젝트를 지나갈 수 없는 장애물로 인식하게 하는 것입니다.
carve 옵션을 켜주면 오브젝트 주위의 반경에 이동할 수 없는 영역이 추가되며 이 영역은 Center와 Size를 통해 조절하면 됩니다.
Carve를 체크해주게 되면 3개 옵션이 더 추가되는데 이 옵션들은 각각 이 장애물이 움직였을 때를 가정하는 것입니다.
Move Threshold : 수치만큼 움직였을 때 장애물이 움직였다고 판정하는 옵션
Time To Stationary : 수치(초)만큼 멈춰있으면 정지하였다고 인식하는 옵션
Carve Only Station : 장애물이 정지하였을 경우에만 장애물로 인식되게 하는 옵션
Nav Mesh Agent는 길을 찾아가는 오브젝트에 붙이는 컴포넌트입니다. 해당 컴포넌트를 붙이면 RigidBody 컴포넌트를 사용하여 오브젝트를 움직일수 없기에 전용 메서드를 활용하여 이동시켜야합니다.
스크립트에서 NavMeshAgent를 사용하여 해당 컴포넌트를 조작할 수 있습니다.
using UnityEngine.AI; 선언이 필요합니다.
NavMeshAgent의 프로퍼티
speed // Agent의 최대 이동속도
remainingDistance // 현재 경로에서 목표 지점까지 거리
isStopped // True 라면 움직임을 멈춘다. False 면 다시 움직임
destination //Agent가 이동하려는 목적지의 위치
NavMeshAgent의 메서드
SetDestination(Vector3 target) //매개변수로 넣은 위치까지 경로로 설정
CalculatePath(Vector3 target,NavMeshPath path) //NavMeshPath 객체에 최적경로의 정보를 담고 bool값을 반환함
NavMeshHit
NavMeshHit 은 다른 NavMeshAgent와 충돌하였을 때 정보를 저장하는 구조체다.
RayCastHit과 비슷한 류의 변수라고 생각하면 될듯하다.
'자료 관리' 카테고리의 다른 글
파티클 시스템 - 1 (메인 모듈) (0) | 2024.12.03 |
---|---|
직렬화(유니티) (0) | 2024.11.04 |
Light (Unity) (0) | 2024.10.25 |
out ref 키워드 (0) | 2024.10.25 |
시간 복잡도 (0) | 2024.10.23 |