본문 바로가기
Unity

[Unity] NavigationSystem #1 - 캐릭터의 목적지 이동

by Kyoung2 2022. 10. 13.
반응형

게임을 제작하다보면 캐릭터나 몬스터, NPC등이 일정한 위치로 이동하게 끔 하는 형태의 기능들을 만들어야 할 때가 있다. Unity로는 쉽게 이 기능을 구성할 수 가 있는데, Navigation System을 통한 위치이동 또는 Path 기능을 커스텀으로 제작하여 이동하게 끔 하는 내용들을 정리하여 이 단원 내내 만들어 볼것이다. 

 

https://docs.unity3d.com/kr/2021.3/Manual/nav-NavigationSystem.html

 

Unity의 내비게이션 시스템 - Unity 매뉴얼

내비게이션 시스템을 통해 게임 월드에서 이동할 수 있는 캐릭터를 생성할 수 있습니다. 2층으로 가기 위해 계단을 오르거나 배수로를 넘기 위해 점프해야 하는지를 이해할 수 있는 능력을 캐릭

docs.unity3d.com

간단한 예제를 통해 캐릭터가 목적지까지 가는 것을 구현하려고 한다.

 


1. Navigation System을 통한 목적지 이동

 -  Navigation System 은 유니티에서 제공하는 기능으로써, 캐릭터가 유니티가 제공하는 알고리즘을 통해 길을 찾고 알아서 판단하여 목적지에 도달하게 끔하는 시스템이다. 보편적으로 사용할 수 있는 기능이며, 여러가지로 활용할 수 있는 기능이기도 하다.

캐릭터가 돌아다닐 Plane을 생성한다.  돌아다닐  Plane 의 크기를 적절하게 키워줘야 Navigation System 이 잘 작동이 되는지 확인이 가능하다. 

 

여러 장애물을 Plane의 자식 객체로 넣어준다.  Navigation System을 통해 캐릭터가 생성한 장애물을 피해서 목적지에 도달하는 것을 확인할 것이다. 

 

Plane 객체이서 Navigation Static 을 클릭한다. 

해당 내용을 체크하면 자식들의 Static value를 모두 체크할 것인지 물어보는 팝업창이 뜬다. 

Yes , Change Children 을 눌러주자.

 

장애물이 너무 단색이다 보니 어디가 어딘지 잘 눈에 띄지 않는다. 

 

머터리얼 폴더를 생성하여 머터리얼을 통해 장애물과 땅바닥을 구분하여 주자.

이렇게 땅바닥과 장애물을 구별하여 놓았다. 이제 Navigation System을 통해  캐릭터가 돌아다닐 수 있는 구역을 확인할 것이다. 

Window -> AI -> Navigation 을 클릭한다.

 

Navigation Window 창에서 bake 항목을 클릭한다.

 

Bake는 굽다라는 아주 기본적인 단어로써,  미리 계산된 프로세스를 저장하는것을 일컫는다.

미리 갈수 있는 영역 또는 제한 사항들을 Bake 한 다음 Agent 를 통해 이동한다.

 

구분 내용
Agent Radius Nav Mesh Agent의 반지름, 반지름의 길이만큼 벽과 떨어져 움직인다.
Agent Height Nav Mesh Agent의 높이, 천장 또는 상단 장애물이 지나다닐 수 있는 영역을 만든다.
Max Slope 최대 경사도
Step Height 계단 사용 여부,  단차가 있는 영역을 설정한다.
Drop Height 낙하 거리 제어
Jump Distance 점프 거리 제어
Advanced Manual voxel size : 베이크 프로세스 작동 정확도 조정
Min Region Area :  최소 영역 설정
Height Mesh :
중요하므로 링크 : https://docs.unity3d.com/kr/530/Manual/nav-HeightMesh.html
하이트 메시(Height Mesh)를 이용하여 걸을 수 있는 표면에 캐릭터를 더 정확하게 배치할 수 있습니다. 

이제 베이크를 해보자.

베이크를 누르면 움직일 수 있는 공간이 이렇게 표현된다.

이제 움직일 수 있는 캐릭터를 생성하자.

Capsule 을 하나 생성한다.

캡슐에 AddComponent를 통해 NavMeshAgent를 삽입하여준다.

NavMeshAgent를 통해 설정한 사항값으로 움직이게 된다.

이제 스크립트를 작성한다.

FollowTarget 파일을 생성했다. 

using UnityEngine;
using UnityEngine.AI;

[RequireComponent(typeof(NavMeshAgent))]
public class FollowTarget : MonoBehaviour
{
	public Transform target;
	Vector3 destination;
	NavMeshAgent agent;

	void Start()
	{
		// Cache agent component and destination
		agent = GetComponent<NavMeshAgent>();
		destination = agent.destination;
	}

	void Update()
	{
		// Update destination if the target moves one unit
		if (Vector3.Distance(destination, target.position) > 1.0f)
		{
			destination = target.position;
			agent.destination = destination;
		}
	}
}

이게 끝이다.  링크 : https://docs.unity3d.com/kr/530/ScriptReference/NavMeshAgent-destination.html

빈 게임 오브젝트를 생성하고  임의의 위치에 놓는다.

Capsule 콜라이더에 FollowTarget 을 넣고 Target에 Transform 객체를 삽입한다.

이제 플레이를 눌러 확인하면 된다.

 

728x90
반응형

# 로딩 화면 동작 코드(Code) 설정하기
loading