길찾기 인공지능이 왜 필요한지
유니티 게임 엔진에서 캐릭터나 객체가 자동으로 경로를 찾아 이동하여 상호작용 할 수 있도록 하기 위함
- 캐릭터가 걸어다닐 수 있는 표면
- 높이, 경사, 장애물 등을 고려하여 최적 경로로 자동 생성
NavMesh(내비게이션 메쉬)
유니티 게임 환경 내에서 캐릭터가 이동할 수 있는 모든 지역을 표현하는
3D
메쉬
2D NavMesh
는 공식적으로 지원되지는 않고 유저들이 만든 커스텀을 써야한다고 한다.신버전
구버전
Agent
: 내비게이션을 이용해 움직일 오브젝트 (적, NPC 등)Radius, Height
: 에이전트의 반경, 높이Max Slope
: 에이전트가 오를 수 있는 최대 경사 각도, <이 값보다 더 높은 경사는 장애물로 간주>Step Height
: 에이전트가 올라갈 수 있는 턱(장애물) 또는 단계의 최대 높이Generated Off Mesh Links
: 에이전트가 지도 내에서 점프 및 낙하하는 설정 ( NavMesh
로 연결되지 않은 지역 간에 이동 )Drop Height
: Off-Mesh Link (NavMesh 없는 지역) 에이전트가 떨어질 수 있는 최대 높이Jump Distance
: 에이전트가 두 지점 사이에서 점프할 수 있는 최대 거리Bake
: 게임 내 환경, 지형을 분석하여 캐릭터가 이동 가능한 영역을 계산 및 생성Ground
선택Ground
(여기서는 바닥 )오브젝트를 Static
으로 설정 후 네비게이션 창에서 Bake
Nav Mesh Agent
컴포넌트 추가Nav Mesh Agent
요소 설명표>속성 | 설명 |
---|---|
Agent Type | 에이전트의 유형 (네비게이션 창 Agent 탭) |
Base Offset | 에이전트의 위치 |
Speed | 에이전트의 이동 속도 |
Angular Speed | 에이전트 회전 속도 |
Acceleration | 에이전트의 가속도 |
Stopping Distance | 목표 지점에 도달했을 때 멈추는 거리 |
Auto Braking | 목표 지점 도착 전 감속 여부 |
Obstacle Avoidance | 장애물 충돌에 대한 콜라이더 설정 |
Radius | 장애물 회피를 위한 에이전트의 반경 |
Height | 장애물 회피 시 에이전트의 높이 설정 |
Quality | 장애물 회피 시 에이전트의 경로 계산 품질 설정 |
Priority | 다른 에이전트 간 우선 순위 설정 |
Path Finding | 경로 찾기 관련 설정 |
Auto Traverse Off Mesh | 오프 메시를 자동으로 넘나들 수 있는지 여부 |
Auto Repath | 경로가 변경되었을 때 자동으로 재계산할지 여부 |
Area Mask | 에이전트가 이동할 수 있는 영역의 마스크 설정 |
using UnityEngine.AI; // AI 관련 클래스 사용
NavMeshAgent agent; // NavMeshAgent 컴포넌트
float distance; // 플레이어 거리 관련 변수
void Start()
{
agent = GetComponent<NavMeshAgent>(); // Nav mesh Agent 컴포넌트 가져옴
}
// 플레이어의 거리에 따른 FSM
private void Idle() // 기본 상태
{
if (distance <= 8) // 플레이어와의 거리가 8 이상이면
{
// 이동 Walk 상태로 전환하는 FSM 로직
agent.isStopped = false; // 이동 시작
}
}
private void Walk()
{
if (distance > 8) // 플레이어와의 거리가 8 보다 크다면
{
// 기본 Idle 상태로 전환하는 FSM 로직
agent.isStopped = true; // 이동 중단
agent.ResetPath(); // 경로 초기화
}
if (distance <= 2) // 플레이어와의 거리가 2 이하라면
{
// Attack 공격으로 전환하는 FSM 로직
agent.isStopped = true; // 이동 중단
agent.ResetPath(); // 경로 초기화
}
}
private void Attack()
{
// 플레이어와의 거리가 2보다 크다면
if (distance > 2)
{
// 이동 Walk 상태로 전환하는 FSM 로직
agent.isStopped = false; // 이동 시작
}
}
이후 유니티로 돌아와 Nav Mesh Agent
컴포넌트에서
각 요소들에 대한 설정을 해주면 된다.
(Speed나 Stopping distance 등)
장애물에 해당하는 Walls 오브젝트에 Nav Mesh Obstacle
컴포넌트도 부여했음.