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

Date:     Updated:

카테고리:

태그:

인프런에 있는 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);
        }
    }
}

image

  • _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


🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기

댓글남기기