Unity 공부 (11)

도토코·2025년 3월 6일

Unity공부

목록 보기
11/22

Camera(1)


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

  • Main Camera를 Player의 자식으로 넣어준다.

    • 이렇게 하니 플레이어가 회전하면 카메라도 같이 회전을 하여 게임화면이 어지러워 진다.
  • Player와 Main Camera를 별개로 두고 Main Camera가 Player와 어느정도의 Vector값을 유지한 상태로 Player를 보며 따라다니게 만든다.

    • Camera의 위치는 플레이어의 위치 + 정해둔 적정 Vector3의 값으로 업데이트를 한다.
    • LookAt()함수를 사용한다.
      • 플레이어가 바라보는 방향으로 회전을 하는 것이 아니라, 카메라가 플레이어의 위치를 바라보게 회전.

Define.cs

using UnityEngine;

public class Define
{
    public enum CameraMode
    {
        QuarterView
    }
}

CameraController.cs

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 상태를 선택
    • default = QuaterView
  • _delta Player와 얼마만큼의 거리를 유지할 것인가에 대한 델타값.
    • 카메라를 플레이어의 자식으로 넣어본 후 카메라의 로컬 위치를 바꾸어 적절한 값을 찾아 낸 후 다시 자식을 해제한 후 적정값을 넣어준다.
  • _player Player의 위치를 알아야 Camera가 따라갈 수 있음.
    • 플레이어 위치 + _delta값을 카메라의 위치로 업데이트.

이렇게 코드를 작성하면 카메라가 회전하지 않고 케릭터를 잘 따라다니는 것을 확인할 수 있다.
그런데 문제가 존재한다. 케릭터가 움직일 때 계속 덜덜덜 떨리는 문제가 발생한다.
이는 캐릭터의 이동에 관한 코드가 Update()에서 그리고 카메라의 포지션 변경에 관한 코드도 Update()에서 실행되어 플레어어의 이동후에 카메라가 따라오거나 카메라가 이동하고 플레이어가 따라오거나 한다.

-> 이 문제를 해결하기 위해서는

  • 플레이어의 이동이 끝난 후에 카메라가 업데이트 되게 한다.
  • LateUpdate()를 사용한다.
  • LateUpdate()

    • Update처럼 매 프레임마다 실행되지만 Update 보다 더 늦게 호출되는 이벤트 함수이다.

    • 만약 Update() 함수로 했다면, PlayerController.cs 에서 플레이어의 위치와 회전값을 업데이트 하는 것과 CameraController.cs 에서 플레이어의 위치와 회전을 업데이트 하는 것이 같은 Update()로서 동시에 섞여 실행되어 아직 업데이트 되지 않은 플레이어의 위치와 회전값으로 카메라가 따라가게 되는 프레임이 발생할 수 있다.

      • PlayerController.cs 에서 `플레이어의 위치와 회전값을 업데이트 하는 OnKeyboard() 함수는 액션에 등록되어 📜Manager.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()함수 안에 카메라의 위치 변경에 관한 코드를 작성해주면 된다.


참조
https://ansohxxn.github.io/unity%20lesson%202/ch5-1/

profile
코(딩)(꿈)나무

0개의 댓글