Main Camera를 Player의 자식으로 넣어준다.
Player와 Main Camera를 별개로 두고 Main Camera가 Player와 어느정도의 Vector값을 유지한 상태로 Player를 보며 따라다니게 만든다.
using UnityEngine;
public class Define
{
public enum CameraMode
{
QuarterView
}
}
using UnityEngine;
public class CameraController : MonoBehaviour
{
[SerializeField]
Define.CameraMode _mode = Define.CameraMode.QuarterView;
[SerializeField]
Vector3 _delta = new Vector3(0.0f, 6.0f, -5.0f);
[SerializeField]
GameObject _player = null;
void Start()
{
}
void LateUpdate()
{
transform.position = _player.transform.position + _delta;
transform.LookAt(_player.transform);
}
public void SetQuaterView(Vector3 delta)
{
_mode = Define.CameraMode.QuarterView;
_delta = delta;
}
}

_mode Define의 CameraMode 상태를 선택_delta Player와 얼마만큼의 거리를 유지할 것인가에 대한 델타값._player Player의 위치를 알아야 Camera가 따라갈 수 있음.이렇게 코드를 작성하면 카메라가 회전하지 않고 케릭터를 잘 따라다니는 것을 확인할 수 있다.
그런데 문제가 존재한다. 케릭터가 움직일 때 계속 덜덜덜 떨리는 문제가 발생한다.
이는 캐릭터의 이동에 관한 코드가 Update()에서 그리고 카메라의 포지션 변경에 관한 코드도 Update()에서 실행되어 플레어어의 이동후에 카메라가 따라오거나 카메라가 이동하고 플레이어가 따라오거나 한다.
-> 이 문제를 해결하기 위해서는
- 플레이어의 이동이 끝난 후에 카메라가 업데이트 되게 한다.
- LateUpdate()를 사용한다.
LateUpdate()
Update처럼 매 프레임마다 실행되지만 Update 보다 더 늦게 호출되는 이벤트 함수이다.
만약 Update() 함수로 했다면, PlayerController.cs 에서 플레이어의 위치와 회전값을 업데이트 하는 것과 CameraController.cs 에서 플레이어의 위치와 회전을 업데이트 하는 것이 같은 Update()로서 동시에 섞여 실행되어 아직 업데이트 되지 않은 플레이어의 위치와 회전값으로 카메라가 따라가게 되는 프레임이 발생할 수 있다.
그렇기 때문에 Player의 위치와 회전값을 업데이트 하는 일이 먼저 일어난 후에 그 위치와 회전 값을 가지고 카메라의 위치와 회전 값을 업데이트 한다.
using UnityEngine;
public class CameraController : MonoBehaviour
{
[SerializeField]
Define.CameraMode _mode = Define.CameraMode.QuarterView;
[SerializeField]
Vector3 _delta = new Vector3(0.0f, 6.0f, -5.0f);
[SerializeField]
GameObject _player = null;
void Start()
{
}
void LateUpdate()
{
if(_mode == Define.CameraMode.QuarterView)
{
transform.position = _player.transform.position + _delta;
transform.LookAt(_player.transform);
}
}
public void SetQuaterView(Vector3 delta)
{
_mode = Define.CameraMode.QuarterView;
_delta = delta;
}
}
위와 같이 LateUpdate()함수 안에 카메라의 위치 변경에 관한 코드를 작성해주면 된다.