1. 캐릭터 이동 구현
https://docs.unity3d.com/Packages/com.unity.inputsystem@1.0/manual/index.html
Input System | Input System | 1.0.2
Input System The Input System package implements a system to use any kind of Input Device to control your Unity content. It's intended to be a more powerful, flexible, and configurable replacement for Unity's classic Input Manager (the UnityEngine.Input cl
docs.unity3d.com
저번에 구현했던 캐릭터 이동을 Input System 패키지로 작업해보려 합니다.
캐릭터 오브젝트에 Player Input 컴포넌트를 추가해주고, [Create Actions...] 버튼으로 기본값들로 세팅된 에셋을 만들어줍니다.
현재 이동버튼만 필요해서 기본으로 생성한 에셋 거의 그대로 쓰기로 했습니다.
(처음 생성시 Move, Look, Fire 액션이 생성되는데 Look만 지웠습니다)
새로 생성한 에셋을 설정해주고 "Invoke C Sharp Events"로 설정해주었습니다.
protected UnityEngine.InputSystem.PlayerInput m_PlayerInput;
protected UnityEngine.InputSystem.InputAction m_InputAction_Move;
public void InitPlayerInput(UnityEngine.InputSystem.PlayerInput playerInput)
{
if (m_PlayerInput == playerInput)
return;
//이전 액션에 콜백 제거
if (m_InputAction_Move != null)
{
m_InputAction_Move.started -= OnInput_Move;
m_InputAction_Move.canceled -= OnInput_Move;
m_InputAction_Move.performed -= OnInput_Move;
m_InputAction_Move = null;
}
m_PlayerInput = playerInput;
if (m_PlayerInput != null)
{
m_InputAction_Move = m_PlayerInput.currentActionMap.FindAction("Move");
}
//신규 액션에 콜백 등록
if (m_InputAction_Move != null)
{
m_InputAction_Move.started += OnInput_Move;
m_InputAction_Move.canceled += OnInput_Move;
m_InputAction_Move.performed += OnInput_Move;
}
}
void OnInput_Move(UnityEngine.InputSystem.InputAction.CallbackContext context)
{
if (context.valueType == null)
{
m_MoveDir = Vector2.zero;
}
else
{
m_MoveDir = context.ReadValue<Vector2>();
}
}
Input System에 맞춰서 코드도 수정해주었습니다.
어렵지 않게 구현되어서 뿌듯하네요.
2. 타겟 카메라 구현
![]() |
![]() |
![]() |
꿈꾸는 섬을 직업 해보면 제가 빨갛게 표시한 선 내에서는 카메라가 움직이지 않고 빨간 선 밖으로 나가면 카메라가 움직이는 것을 알 수 있습니다.
이 부분을 Cinemachine에 Virtual Camera 컴포넌트로 작업해 줄 예정입니다.
https://docs.unity3d.com/Packages/com.unity.cinemachine@2.3/manual/index.html
Cinemachine Documentation | Package Manager UI website
Cinemachine Documentation Cinemachine is a suite of modules for operating the Unity camera. Cinemachine solves the complex mathematics and logic of tracking targets, composing, blending, and cutting between shots. It is designed to significantly reduce the
docs.unity3d.com
우선은 Main Camera에 CenamachineBrain을 달아줍니다.
Virtual Camera를 생성해서 Follow, Look At을 캐릭터로 설정해줍니다.
Virtual Camera의 Body 설정을 해줍니다.
Framing Transposer으로 설정해주면 꿈꾸는 섬에서 보았던 카메라와 비슷하게 구현이 가능합니다.
핵심 되는 부분은 Dead Zone 부분인데 이 부분은 카메라가 따라가지 않는 영역입니다.
Game View에서 영역을 볼 수 있습니다.
아무런 레이어가 없는 부분이 Dead Zone입니다.
값을 조절하는 것만으로도 쉽게 구현했네요.
사실 이걸 직접 구현하면 재밌겠다 생각했는데 Cinemachine에서 다 만들어져 있어서 조금 아쉽긴 합니다.
3. 맵 데이터를 어떻게 관리할지 고민
꿈꾸는섬을 직접 해보면 존을 이동하는데 로딩이 없이 이동하는 것을 볼 수 있는데, 보통 이 방식을 심리스(Seamless) 방식이라고 하더라구요.
사실 꿈꾸는 섬 하다 보면 로딩은 없는데 존을 이동할 때 프레임드랍이 조금 있는 걸로 봐서는 어느 시점에 로딩이 이루어지는지 짐작은 됩니다.
1안) 보여지는 블럭 단위로 그리기
![]() |
![]() |
블럭단위로 나누어서 실제 보여지는 블럭만 실제로 그리는 방식입니다.
위 사진에서 노란 영역만 그려진다고 보시면 됩니다.
- 장점
- 그려지는 부분만 Load 하고 Instantiate 하기 때문에 메모리에 부담이 적음
- 단점
- 조금만 카메라가 움직여도 Load와 Instantiate가 발생하기 때문에 CPU부담이 발생하는데, 전투 중에 프레임드랍을 발생시킬 수 있음.
- 합쳐지지 않은 각 블럭들을 따로 그리기 때문에 GPU부담이 발생.
2안) 전체 맵 한 번에 그리기
2안을 꼭 가져와야 할까 했는데 3안을 위해 2안을 적었습니다.
전체 맵을 한 번에 그리는 방식입니다.
- 장점
- 한번에 그리기 때문에 Load, Instantiate로 인한 부담이 적음.
- 단점
- 한번에 그려야 할 영역이 매우 크기 때문에 GPU와 메모리 부담이 큼.
3안) 구역별로 나누어 그리기
![]() |
![]() |
![]() |
위에서 소개한 1안 2안의 절충안입니다.
나누어서 그리면 CPU, GPU에 부담이 되고, 한 번에 그리면 메모리에 부담이 되니, "적당히" 영역별로 나누어 그리는 방식입니다.
첫 번째 사진처럼 분할해서, 실제로는 두번째 사진 처럼 그려지게 됩니다.
결정
사실 3안으로 이미 결정해두었습니다.
결정을 해놓고 1안, 2안을 가져온 이유는 왜 이렇게 구현하게 되는지 설명하기 위해서였습니다.
4. 3D 타일맵 툴 리서치
https://the-paper.notion.site/Unity-3D-6b9d5bfe841a446c89c1110e4eac0510
Unity 3D 타일맵 정리
the-paper.notion.site
Asset Store 위주로 간단하게 리서치해서 노션에 정리했습니다.
혹시 필요하신 분들 참고하시면 될 것 같아요.
5. 2D Tilemap Editor로 배치해보기
2D TileMap Editor를 이용해서 3D 오브젝트를 배치하는 방법입니다.
현재 무료로 빠르게 사용해볼 수 있어서 이 방법을 써보기로 했습니다.
https://www.kenney.nl/assets/platformer-kit
Kenney • Platformer Kit
This package includes a wide range of objects for use in platformers and other related games. Including landscape tiles, items, blocks, hazards and more.
www.kenney.nl
에셋은 영상에서 사용한 Kenny Platformer Kit으로 작업했습니다.
어렵지 않게 가능했는데 2D용으로 만들어진 툴을 3D에서 사용하려니 기능이 제한적이라 좀 더 확장이 힘들어 보여서 사용하지 않기로 했습니다.
6. 유료 에셋 (Autotiles 3D) 써보기
https://assetstore.unity.com/packages/tools/utilities/autotiles-3d-tilemap-level-editor-205724
Autotiles 3D - Tilemap Level Editor | 유틸리티 도구 | Unity Asset Store
Use the Autotiles 3D - Tilemap Level Editor from Philip Beaucamp on your next project. Find this utility tool & more on the Unity Asset Store.
assetstore.unity.com
에셋스토어에 들어가니 추천해주던 에셋인데 이걸 써보기로 했습니다.
이번에 유료 에셋을 사용하게 된 이유는 제가 3D 타일맵 툴을 개발한 적도 직접 써본 적도 별로 없어서 이참에 유료에셋을 통해서 이해도를 높이고자 하는 목적도 있습니다. 언젠가는 비슷한 툴을 개발하게 될 수도 있으니까요.
![]() |
![]() |
매뉴얼을 보고 차근차근해보니 그럴싸하게 배치가 되었습니다.
이걸 그대로 써도 문제없을 것 같아요.
7. 다음에 할 일
현재 Translate로만 구현되어 있어서 지형에 상관없이 이동하도록 되어있습니다.
이 부분을 Navigation을 통해서 이동하도록 구현해 볼 예정입니다.
'개인프로젝트 일지' 카테고리의 다른 글
유니티로 "젤다의 전설: 꿈꾸는 섬" 모작 6일차 (0) | 2022.09.12 |
---|---|
유니티로 "젤다의 전설: 꿈꾸는 섬" 모작 5일차 (2) | 2022.09.10 |
유니티로 "젤다의 전설: 꿈꾸는 섬" 모작 4일차 (0) | 2022.09.08 |
유니티로 "젤다의 전설: 꿈꾸는 섬" 모작 3일차 (0) | 2022.09.08 |
유니티로 "젤다의 전설: 꿈꾸는 섬" 모작 1일차 (0) | 2022.09.03 |