공부/인프런 - Rookiss

Part 3-5-1. 카메라 : 카메라가 플레이어를 따라다니게 만들기

셩잇님 2023. 8. 21. 15:41
반응형

 

 

카메라

카메라가 플레이어를 따라다니게 만들기

 

방법 소개
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

 

 

 

반응형