카메라
카메라가 플레이어를 따라다니게 만들기
방법 소개
1️⃣ 카메라를 플레이어의 자식으로 넣기
단점 👉 플레이어가 회전하면 카메라도 같이 회전한다. 그래서 휙휙 돌아서 너무 어지럽다.
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 여유를 두고 따라가도록 하기 위해
LateUpdate()
현재 CameraMode 값이 QuaterView 라고 설정되어 있다면
1️⃣ 카메라의 위치는 (플레이어와의 위치 + 정해두었던 적정 Vector3 값)로 업데이트 하고 👉 카메라가 플레이어를 따라 감
2️⃣ 카메라는 플레이어의 위치를 바라보게 회전한다. LookAt
'공부 > 인프런 - Rookiss' 카테고리의 다른 글
Part 3-5-3. 카메라 : 카메라가 벽에 막힐시, 벽 앞으로 카메라 이동시키기 (1) | 2023.08.21 |
---|---|
Part 3-5-2. 카메라 : 클릭한 곳으로 플레이어 이동하기 (0) | 2023.08.21 |
Part 3-4-2. Raycast, LayerMask, Tag, 투영의 개념 (0) | 2023.08.21 |
Part 3-4-1. Collider, Collision, Trigger (0) | 2023.08.17 |
Part 3-3-1. Prefab (프리팹), Resource Manager (0) | 2023.08.17 |