본문 바로가기
C#

[C#][Unity] 내비게이션 시스템(1)

by teamnova 2023. 7. 19.

NavMesh 란??

Nav 는 내비게이션을 말하고 Mesh라는 단어는 3D에서는 삼각형이나 다각형 여러 개로 면을 구성하는 것을 의미합니다.

NavMesh는 Unity 게임 엔진에서 사용되는 내비게이션 시스템입니다. 이 기능을 사용하면 게임 캐릭터나 AI 게임오브젝트가 이동할 수 있는 경로를 자동으로 계산하고 이동할 수 있습니다. NavMesh 시스템은 설정 한 지형 데이터를 분석하여 게임 오브젝트의 이동 가능한 영역을 설정하고, 게임 캐릭터나 AI게임오브젝트가 해당 영역을 따라 이동할 수 있도록 자동으로 경로를 계산해 주는 아주 편리한 기능입니다. 오늘은 이기능을 활용하여 게임오브젝트가 길을 자동으로 찾아 목적지 까지 도달하는 예제를 만들어 보겠습니다.

 

더 자세한 설명은 아래의 링크에 들어가서 공부해보세요!

https://docs.unity3d.com/Manual/nav-BuildingNavMesh.html

 

 

 

먼저 유니티 Hub에서 New Project 버튼을 누릅니다.

 

 

그 후  화면 왼쪽 Hierarchy창에서 마우스 우클릭을 해 3D Object -> Plane을 생성하고 Position (0, 0, 0)으로 설정 Scale(1,1,5) 으로 설정해 게임오브젝트가 움직일 수 있는 맵을 만들어 줍니다.

그 다음 같은 방법으로 Hierarchy창에서 마우스 우클릭을 해 3D Object -> Capsule를 생성하고 해당 Capsule의 position (0,1,-20) 으로 설정해주세요

이어서 Plane 과 Capsule 를 구별할 수 있도록 Capsule 의 색을 변경하겠습니다.

하단 Project창에서 마우스 우클릭 한 뒤 Create Material을 생성해주세요.

생성된 Material 를 클릭한 후 inspector 창에 있는 Albedo 속성 옆에 팔레트를 클릭하여 원하는 색상으로 변경해주세요.

후에 Material를 드래그하여 Capsule 에 넣어주세요 

그리고 장애물을 만들어 보겠습니다. 장애물은 마음대로 한번 만들어 보세요

저는 이런식으로 만들어 보았습니다.

그리고 왼쪽 끝에 Capsule 가 이동할 목적지를 만들어 놓을게요 목적지는 Cube 로 만들어 줬습니다.

 

이제 NavMesh를 사용해서 자동으로 Capsule GameObject가 자동으로 목적지에 가도록 만들어 보겠습니다.

 

유니티 상단에 Window - >  Ai -> Navigation 을 눌러주세요

그리고 움직이는 공간인 Plane GameObject를 클릭 후 우측 Navigaition 창에서 Navigation Staic 으로 지정하고

Navigaition Area 에서 Walkable 로 변경해줍니다 

그 후에 장애물로 설정했던 GameObject들을 드래그 후 위와 같이 설정하는데 장애물 GameObject는 Navigaition Area 속성을 Not Walkable 로 설정해주셔야 합니다.

후에 Bake 로 이동하신 후 하단에 있는 Bake 버튼을 누르면

이렇게 변하게 됩니다.

Bake 에 있는 Agent Radius, Agent Heiget와 같은 값들을 변경하고 다시 Bake 를 누르면서 어떤 것들이 변하는지 한번 확인해보세요. 

Agent Radius, Agent Heiget 에 대해 더 궁금한 것이 있다면 아래의 링크에서 찾아 공부해보세요

https://docs.unity3d.com/ScriptReference/AI.NavMeshAgent.html 

 

Unity - Scripting API: NavMeshAgent

Success! Thank you for helping us improve the quality of Unity Documentation. Although we cannot accept all submissions, we do read each suggested change from our users and will make updates where applicable. Close

docs.unity3d.com

이제 움직일 Capsule GameObject 에 NavMeshAgent를 달아보겠습니다. Capsule 클릭 후 Inspector 창에서 Add Component를 누릅니다.

Agent 검색 후 아래의 컴포넌트를 추가합니다.

그리고 Capsule 게임오브젝트에 스크립트를 넣어 보겠습니다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
// 꼭 넣어주세요 !
using UnityEngine.AI;

public class CapsuleMoveNav : MonoBehaviour
{
    // 목표지점
    public GameObject Point;
    // NavMeshAgent 컴포넌트
    private NavMeshAgent agent;
    void Start()
    {
        agent = GetComponent<NavMeshAgent>();
    }
    void Update()
    {
        // NavMeshAgent 의 월드 좌표에서 목적지을 설정합니다.
        agent.SetDestination(Point.transform.position);
    }
}

그리고 목적지 게임오브젝트를 드래그하여 아래와 같이 스크립트 Point 변수에 넣어주세요!

결과입니다.

 

Capsule GameObject 에 있는 NavMeshAgent 속성을 변경하면서 무엇이 변하는지 확인해보세요 ! ㅃ2~