Unity - Player에 카메라 시점 고정

walnut_mr·2025년 1월 15일

Unity 개념 정리

목록 보기
2/6
post-thumbnail

배경

2D, 3D 게임을 할 때 Player의 위치가 변함에 따라 camera가 Player를 따라가줘야 한다. Main Camera가 Player를 쫓아가지 못한다면 Player는 유저의 입력에 따라 이동하지만, 화면이 이를 따라가지 못해 유저의 화면에서 Player가 벗어나게 되는 오류가 생긴다.

Unity에서 정의하는 Camera는 다음과 같다.

"MainCamera"라는 tag를 가진 component이며, "MainCamera"라는 tag로 활성화된 camera가 없다면 Camera.main은 null 값을 가진다.

사용법

Unity의 모든 프로젝트에는 기본적으로 Hierarchy에 Main Camera와 Global Light가 존재한다.
Main Camera가 바로 Game 실행 시 보이게 되는 유저의 게임 시점이다.

Player의 움직임에 따라 Main Camera가 Player의 동선과 동일하게 움직여야 한다는 점을 주의하자.

  1. MainCamera component가 등록이 안 되었을 경우를 대비하여, 게임 실행 ( Start() )시 Main Camera component를 제대로 할당해주는 작업이 필요하다.
  2. MainCamera를 할당했다면, Player의 움직임과 동일하게 Camera도 이동시켜줘야 한다. ( Update() )
using UnityEngine;

public class Driver : MonoBehaviour
{
    [Header("Settings")]
    [SerializeField] private float steerSpeed;
    [SerializeField] private float moveSpeed;
    [SerializeField] private float steerAmount;
    [SerializeField] private float moveAmount;

    [Header("References")]
    [SerializeField] private Camera mainCamera;

    void Start()
    {
        if (mainCamera == null)
        {
            mainCamera = GameObject.FindWithTag("MainCamera").GetComponent<Camera>(); // Main Camera 할당
        }
    }
    
    void LateUpdate()
    {
        // 카메라 따라 움직임
        mainCamera.transform.position = this.transform.position + new Vector3(0, 0, -30);
    }
    

    void Update()
    {
    	// 기본 움직임 (좌우, 상하)
        steerAmount = Input.GetAxis("Horizontal") * steerSpeed * Time.deltaTime; // 좌우 무빙 키보드 입력
        moveAmount = Input.GetAxis("Vertical") * moveSpeed * Time.deltaTime; // 상하

        transform.Rotate(0, 0, -steerAmount); // steering 조향각 조정
        transform.Translate(0, moveAmount, 0);

    }
}

위의 Main Camera를 할당하는 코드를 먼저 살펴보자.

void Start()
{
	if (mainCamera == null)
    {
    	mainCamera = GameObject.FindWithTag("MainCamera").GetComponent<Camera>();
    }
}

Start() 에서 mainCamera가 할당되어 있지 않다면, "MainCamera"라는 tag를 가진 GameObject의 Camera Component를 찾아 할당해준다.

void LateUpdate()
{
	mainCamera.transform.position = this.transform.position + new Vector3(0, 0, -30);
    /*
    * 이하 코드 생략
    */
}

이후 mainCamera의 position을 Player의 이동에 맞춰 동일하게 움직여주는 과정이 필요하다.
여기서 this는 현재 script를 할당해준 GameObject를 나타내며, this = Player GameObject이다.

Player의 position에서 z값만 더해주어 Player의 이동 동선과 동일하게 움직이는 Camera를 설정할 수 있다.

부가 설명

< z값 더해주는 이유 - 시각적 설명 >

Main Camera의 z값이 -60, Player (Car 2_0)의 z값이 -30으로, 초기 상태에서 z값이 -30만큼 차이나기 때문에

옆에서 봤을 때 camera와 Player가 수직으로 연결되어 같이 움직인다고 생각하면 쉽게 이해된다.

  • LateUpdate()에서 camera moving 처리하는 이유
    LateUpdate()는 매 frame의 Update() 작업이 종료되는 시점에 호출된다.
    Player의 이동을 Update()에서 처리하므로, 해당 작업 이후 Camera의 moving도 처리해주는 것이 일반적이다

profile
https://github.com/khkim09

0개의 댓글