Chapter 5-1. 카메라가 플레이어를 따라다니게 만들기
카테고리: Unity Lesson 2
태그: Unity Game Engine
인프런에 있는 Rookiss님의 [C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진 강의를 듣고 정리한 필기입니다. 😀
🌜 강의 들으러 가기 Click
Chapter 5. 카메라
🚖 카메라가 플레이어를 따라다니게 만들기
방법 소개
- 1️⃣ 카메라를 플레이어의 자식으로 넣기
- 단점 👉 플레이어가 회전하면 카메라도 같이 회전한다. 그래서 휙휙 돌아서 너무 어지럽다.
- 생존 게임 클론 강의 들을 때 카메라를 플레이어의 자식으로 넣어 1 인칭 카메라로 구현했었는데, 그땐 플레이어가 x, y, z 모든 축으로의 회전을 다 막아둔 상태였기 때문에(Rigidbody의 Constraints로) 플레이어가 회전할 때마다 카메라도 같이 휙휙 회전할 일이 없었다. 플레이어를 캡슐 Mesh로 구현했어서 이렇게 구현했었다. 그땐 플레이어는 회전하지 않고 플레이어 머리에 달린 카메라가 회전하게 했었다.
- 결론은.. 카메라가 플레이어를 따라다니게 할 때 꼭 자식으로 넣어서 구현할 필요는 없다는 것이다.
- 단점 👉 플레이어가 회전하면 카메라도 같이 회전한다. 그래서 휙휙 돌아서 너무 어지럽다.
- 2️⃣ 부모-자식 관계가 아닌 별개로 두되, 카메라가 플레이어와 적정 Vector3 값을 유지한체, 플레이어를 바라보며 따라다니게 하기
- 카메라의 위치는 (플레이어와의 위치 + 정해두었던 적정 Vector3 값)로 업데이트 하고
- 카메라는 플레이어의 위치를 바라보게 회전한다. LookAt
- 플레이어가 바라보는 방향으로 회전하는 것이 아닌, 카메라가 그냥 플레이어의 위치를 바라보게 회전하는 것이다.
📜Define.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Define
{
public enum CameraMode
{
QuaterView,
}
}
📜Define 클래스에 CameraMode 라는 enum 을 정의하였다. 상태 종류로는 일단 QuaterView
하나만 추가.
📜CameraController.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CameraController : MonoBehaviour
{
[SerializeField]
Define.CameraMode _mode = Define.CameraMode.QuaterView;
[SerializeField]
Vector3 _delta;
[SerializeField]
GameObject _player;
void LateUpdate()
{
if (_mode == Define.CameraMode.QuaterView)
{
transform.position = _player.transform.position + _delta;
transform.LookAt(_player.transform);
}
}
}
_mode
👉 📜Define의 CameraMode 상태를 선택- 디폴트값을
QuaterView
로 설정해주었다.
- 디폴트값을
_delta
👉 플레이어와 얼만큼의 Vector3 값을 유지할 것인지에 대한 그 델타값.- 미리, 카메라를 플레이어의 자식으로 한번 넣어보고난 후 얼마만큼의 거리가 좋을지 카메라의 로컬 위치를 이리저리 바꿔
_delta
으로 설정할 적절한 값을 찾아내었따. 플레이어로부터 항상 (0, 8, -3.5) 만큼 유지할 때 잘 보여서 이렇게 정했다.- 물론 다시 카메라를 플레이어로부터 해제함.
- 미리, 카메라를 플레이어의 자식으로 한번 넣어보고난 후 얼마만큼의 거리가 좋을지 카메라의 로컬 위치를 이리저리 바꿔
_player
👉 플레이어의 위치를 알아야 따라갈 수 있으므로..- 플레이어의 위치 +
_delta
값을 카메라의 위치로 업데이트 할 것이다. - 플레이어 오브젝트 할당
- 플레이어의 위치 +
- LateUpdate()
- Update처러 매 프레임마다 실행되나, Update 보다 더 늦게 호출되는 이벤트 함수다.
- ⭐ 만약 Update() 함수로 했다면, 📜PlayerController.cs 에서 플레이어의 위치와 회전값을 업데이트 하는 것과 📜CameraController.cs 에서 플레이어의 위치와 회전을 업데이트 하는 것이 같은 Update()로서 동시에 섞여 실행되기 때문에 아직 업데이트 되지 않은 플레이어의 위치와 회전값으로 카메라가 따라가게 되는 프레임이 발생할 수 있다.
- 정확히 말하자면 📜PlayerController.cs 에서 `플레이어의 위치와 회전값을 업데이트 하는 OnKeyboard() 함수는 액션에 등록되어 📜Manager.cs 의 Update() 에서 실행 됨
- 따라서 반드시 플레이어의 위치와 회전값을 업데이트 하는 일은 📜PlayerController.cs 에서 먼저 이루어지고 난 후에 업데이트 된 플레이어의 위치와 회전 값을 가지고 카메라의 위치와 회전 값을 업데이트 해야 한다.
- 그래서 📜CameraController.cs 에선 카메라의 위치와 회전값을 업데이트 하는 일을 Update 보다 더 늦게 호출되는 LateUpdate() 안에서 한다. 📜PlayerController.cs 에서 플레이어의 위치와 회전값 업데이트를 마친 후에 그 업데이트 된 값을
_delta
여유를 두고 따라가도록 하기 위하여
- 그래서 📜CameraController.cs 에선 카메라의 위치와 회전값을 업데이트 하는 일을 Update 보다 더 늦게 호출되는 LateUpdate() 안에서 한다. 📜PlayerController.cs 에서 플레이어의 위치와 회전값 업데이트를 마친 후에 그 업데이트 된 값을
- LateUpdate()
- 현재 CameraMode 값이
QuaterView
라고 설정되어 있다면- 1️⃣ 카메라의 위치는 (플레이어와의 위치 + 정해두었던 적정 Vector3 값)로 업데이트 하고 👉 카메라가 플레이어를 따라 감
- 2️⃣ 카메라는 플레이어의 위치를 바라보게 회전한다. LookAt
- 현재 CameraMode 값이
🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄
댓글남기기