24.02.19 TIL - Unity : 유니티의 길 찾기 인공지능 (Navigation)

JJwoo·2024년 2월 18일
0

길찾기 인공지능이 왜 필요한지

유니티 게임 엔진에서 캐릭터나 객체가 자동으로 경로를 찾아 이동하여 상호작용 할 수 있도록 하기 위함

  • 캐릭터가 걸어다닐 수 있는 표면
  • 높이, 경사, 장애물 등을 고려하여 최적 경로로 자동 생성

유니티 게임 환경 내에서 캐릭터가 이동할 수 있는 모든 지역을 표현하는 3D 메쉬

  • 2D NavMesh는 공식적으로 지원되지는 않고 유저들이 만든 커스텀을 써야한다고 한다.

<관련 내용 링크>
(https://www.inflearn.com/questions/1064969/2d%EC%97%90%EC%84%9C-navmesh%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95%EC%9D%B4-%EA%B6%81%EA%B8%88%ED%95%A9%EB%8B%88%EB%8B%A4)

설치 방법 : Pakage Manager


신버전


구버전

  • Agent : 내비게이션을 이용해 움직일 오브젝트 (적, NPC 등)
    • 속도, 회전 속도, 경로 추적 정밀도 등을 설정
    • Radius, Height : 에이전트의 반경, 높이
    • Max Slope : 에이전트가 오를 수 있는 최대 경사 각도, <이 값보다 더 높은 경사는 장애물로 간주>
    • Step Height : 에이전트가 올라갈 수 있는 턱(장애물) 또는 단계의 최대 높이
    • Generated Off Mesh Links : 에이전트가 지도 내에서 점프 및 낙하하는 설정 ( NavMesh로 연결되지 않은 지역 간에 이동 )
      • Drop Height : Off-Mesh Link (NavMesh 없는 지역) 에이전트가 떨어질 수 있는 최대 높이
      • Jump Distance : 에이전트가 두 지점 사이에서 점프할 수 있는 최대 거리
  • Bake : 게임 내 환경, 지형을 분석하여 캐릭터가 이동 가능한 영역을 계산 및 생성

유니티 실습

  • 여기서는 적 오브젝트에게 NavMesh 기능을 사용하고, 플레이어를 추적하는 기능을 구현.

1. NavMesh 범위 설정

  • 게임 씬에서 지도에 포함 할 오브젝트 Ground 선택
  • Ground (여기서는 바닥 )오브젝트를 Static 으로 설정 후 네비게이션 창에서 Bake


  • 현재 씬의 이름으로 된 폴더 안에 NavMesh 데이터가 생성 된 모습.

2. NavMesh Agent 컴포넌트 + 스크립트 작성

  • 기능을 활용 할 적 오브젝트의 인스펙터에 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 컴포넌트도 부여했음.

profile
개발 모코코

0개의 댓글

관련 채용 정보