Unity 게임 카메라 움직이는 코드 분석

1. 카메라 각도 조절

 

기본 카메라가 이런데,

 

 

 

main camera에서 position을 조절하면 카메라 각도를 바꿀 수 있다

 

 

 

 

main camera를 드래그해서 player쪽에 놓으면 player의 자식이 되는데

 

player가 움직이면 main camera도 그걸 따라가게 된다

 

 

 

 

 

근데 player가 z축으로 움직이면, 카메라도 z축으로 회전하다보니 문제가 생길 수 있다

 

 

 

 

이런 경우 스크립트를 이용해서, player 오브젝트가 움직일 때 카메라가 상대적인 위치로 이동할 수 있도록 설정

 

 

2. 스크립트로 카메라 움직이기

 

main camera에 스크립트 생성하고 붙이기

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CameraController : MonoBehaviour
{
    public GameObject player;
    private Vector3 offset;
    // Start is called before the first frame update
    void Start()
    {
        offset = transform.position - player.transform.position;
    }

    // Update is called once per frame
    void LateUpdate()
    {
        transform.position = player.transform.position + offset;
    }
}

 

 

 

player 게임 오브젝트와 연결하기 위해 public GameObject player;로 선언

 

상대적 이동을 위한 private Vector3 offset; 선언

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CameraController : MonoBehaviour
{
    public GameObject player;
    private Vector3 offset;
    
    // Start is called before the first frame update
    void Start()
    {
    }

    // Update is called once per frame
    void Update()
    {
    }
}

 

 

transform은 오브젝트의 위치를 나타내는 inspector

 

 

 

카메라의 transform에 player의 transform을 빼서, 상대적인 위치를 알 수 있다

 

이런 상대적인 위치는 게임 시작하자마자 계산하고, 처음에 어떻게 되어있는지만 알면, 게임 진행하면서 바꿀 필요는 없다

 

transform.position으로 현재 스크립트와 연결된 camera의 transform

 

불러온 게임 오브젝트의 player.transform.position으로 player의 transform

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CameraController : MonoBehaviour
{
    public GameObject player;
    private Vector3 offset;
    // Start is called before the first frame update
    void Start()
    {
        offset = transform.position - player.transform.position;
    }

    // Update is called once per frame
    void LateUpdate()
    {

    }
}

 

 

 

player가 매 프레임마다 움직이면서 player.transform.position 값은 바뀌는데...

 

이제 camera의 transform.position도 그 offset에 맞춰서 바꿔줘야한다.

 

offset = transform.position - player.transform.position에서

 

transform.position = offset + player.transform.position으로 현재 움직인 player.transform.position에서

 

처음에 계산한 상대적인 위치 offset을 더해주면, 카메라의 위치가 항상 처 상대적인 위치를 유지하게 된다

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CameraController : MonoBehaviour
{
    public GameObject player;
    private Vector3 offset;
    // Start is called before the first frame update
    void Start()
    {
        offset = transform.position - player.transform.position;
    }

    // Update is called once per frame
    void Update()
    {
        transform.position = player.transform.position + offset;
    }
}

 

 

 

플레이어가 공을 굴리면 카메라가, 표시되기 전의 프레임에서 플레이어의 위치에 맞춰 새 위치로 움직인다

 

위치만 따라가고 회전은 하지 않는다

 

그런데 Update는 프레임마다 실행하는데 프레임마다 게임 오브젝트의 위치를 추적해서 카메라의 위치를 설정은 하는데

 

동작 순서를 제어할 수는 없다

 

여러 Update가 동시에 있으면, 어떤 update가 먼저 실행될지 제어할 수가 없다 이 말인듯??

 

카메라 이동이랑 물리적 이동이랑 순서가 바뀔 수 있다는건가

 

카메라를 따라가거나 최근 상태 수집같은 작업에서는 LateUpdate를 사용

 

Update처럼 매 프레임마다 실행되나, 다른 Update가 모두 실행된 뒤에 실행

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CameraController : MonoBehaviour
{
    public GameObject player;
    private Vector3 offset;
    // Start is called before the first frame update
    void Start()
    {
        offset = transform.position - player.transform.position;
    }

    // Update is called once per frame
    void LateUpdate()
    {
        transform.position = player.transform.position + offset;
    }
}

 

 

플레이어가 현재 프레임에서 움직임을 완료하기 전에는 카메라가 이동하지 않는다

 

 

Update해도 딱히 차이를 못느끼겠는데

 

이제 main camera inspector에서 스크립트 쪽에 Player 부분에 None이라고 되어 있는데,

 

player가 뭐인지 알려줘야한다

 

처음에 스크립트에서 게임 오브젝트를 불러왔었잖아.. 그게 뭔지를 알려줘야함

 

 

 

 

 

이제 카메라가 공 따라 잘 움직임

 

 

TAGS.

Comments