🎮카메라 조정

⚙️카메라 위치 조정

Hierachy 창에서 Main Camera를 눌러 Inspector 창에서 Size를 늘려서 카메라가 화면을 더 멀리서 찍게 할 수 있다.

CameraSize


⚙️플레이어 추적 카메라

카메라가 플레이어를 따라가도록 하려면 카메라의 위치가 플레리어의 위치와 같으면 될 것이다.

우선 플레이어 오브젝트에 카메라와 관련된 기능을 만들어 주기 위해 새로운 C# 스크립트를 만들어준다. FollowCamera라는 스크립트를 만들었고 이것을 Main Camera 오브젝트의 컴포넌트로 추가한다.

매 프레임마다 카메라가 플레이어를 따라가게 만들것이기 때문에 스크립트에 있는 Start 메서드는 지워준다.

스크립트가 적용된 카메라의 오브젝트는 transform.position으로 현재 위치를 알 수 있다. 하지만 해당 스크립트가 적용된 오브젝트 외의 다른 오브젝트(플레이어)의 위치를 알기는 어렵다.

다른 오브젝트(플레이어)의 위치를 알기 위해 필요한 것이 참조(Reference)이다.

참조를 사용하기 위해 우선 Inspector에서 조정할 수 있는 SerializeField를 만들어준다. 플레이어 오브젝트의 타입은 GameObject이다. 따라서 GameObject형의 변수를 SerializeField로 만들어 준다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class FollowCamera : MonoBehaviour
{
    // 카메라가 차의 위치와 같아야 한다.
    [SerializeField] GameObject thingToFollow;

    void Update()
    {

    }
}

스크립트를 저장하고 유니티로 돌아가서 Main Camera의 Inspector에서 아래와 같이 플레이어에 해당하는 오브젝트를 SerializeField로 지정한 변수에 넣어준다.

Reference


참조를 플레이어에 잘 적용했다. 이제 플레이어의 정보를 알기 위해 플레이어에 해당하는 오브젝트를 저장한 thingToFollow 변수를 사용해서 플레이어의 위치를 카메라 위치에 대입해준다.

1
2
3
4
5
6
7
8
9
10
public class FollowCamera : MonoBehaviour
{
    // 카메라가 차의 위치와 같아야 한다.
    [SerializeField] GameObject thingToFollow;

    void Update()
    {
        transform.position = thingToFollow.transform.position;
    }
}

스크립트를 저장하고 프로젝트를 실행하면 카메라가 의도대로 동작하지 않고 뭔가 이상하다는 것을 확인할 수 있다. 현재 카메라의 위치가 정확하게 플레이어의 위치와 같기 때문에 플레이어를 뚫고 배경만 비추고 있어서 문제가 된 것이다.

문제를 해결하기 위해 카메라의 위치가 플레이어와 살짝 멀어지면 될 것 같다. 플레이어의 위치와 z축 방향으로 살짝 오프셋을 준 값을 더해 카메라 위치에 대입한다.

위치 값은 Vector3(x, y, z)로 되어있어서 플레이어 위치에 새로운 Vector3값을 더해주면 된다. 하지만 여기서 현재 Vector3에 새로운 Vector3를 더하기 위해서는 new라는 키워드를 사용해야 한다.

1
2
3
4
5
6
7
8
9
10
public class FollowCamera : MonoBehaviour
{
    // 카메라가 차의 위치와 같아야 한다.
    [SerializeField] GameObject thingToFollow;

    void LateUpdate()
    {
        transform.position = thingToFollow.transform.position + new Vector3(0, 0, -10);
    }
}

이제 스크립트를 저장하고 프로젝트를 실행하면 플레이어를 움직일 때마다 카메라가 플레이어를 따라가는 것을 확인할 수 있다.


💡LateUpdate()

Update() 메서드에 위의 내용을 적용하면 카메라가 차보다 약간 느리거나 더 빠르게 움직일 수도 있다. 위의 내용을 언제 정확히 실행하라고 명시하지 않았기 때문이다.

유니티 실행 순서를 보면 일반적인 Update()말고도 LateUpdate()가 있다는 것을 확인할 수 있다. LateUpdate()는 Update()에서 해야 하는 모든 작업이 끝나고 나서 게임 로직의 제일 마지막에 하는 Update이다.

카메라 위치 계산을 LateUpdate()에 수행하게 하여 Update()의 다른 작업들과의 충돌을 피할 수 있도록 만들었기 때문에 조금 더 부드러운 움직임을 만들어낼 수 있다.

https://docs.unity3d.com/Manual/ExecutionOrder.html



Leave a comment