게임을 제작하다보면 캐릭터나 몬스터, NPC등이 일정한 위치로 이동하게 끔 하는 형태의 기능들을 만들어야 할 때가 있다. Unity로는 쉽게 이 기능을 구성할 수 가 있는데, Navigation System을 통한 위치이동 또는 Path 기능을 커스텀으로 제작하여 이동하게 끔 하는 내용들을 정리하여 이 단원 내내 만들어 볼것이다.
https://docs.unity3d.com/kr/2021.3/Manual/nav-NavigationSystem.html
간단한 예제를 통해 캐릭터가 목적지까지 가는 것을 구현하려고 한다.
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 객체를 삽입한다.
이제 플레이를 눌러 확인하면 된다.
'Unity' 카테고리의 다른 글
[3D 그래픽스 기초] 포워드 랜더링 & 디퍼드 랜더링 차이점 (0) | 2023.06.15 |
---|---|
[Unity] CountDown(카운트다운) 타이머를 만들어보자. (0) | 2023.03.03 |
[Unity] Addressable 시스템 활용 (0) | 2022.08.21 |
[Unity] 싱글톤 클래스 (0) | 2022.06.28 |
[Unity] 다국어 지원 (0) | 2022.06.23 |