1인칭 시점을 구현하기 위해서는 게임 오브젝트에 따라 카메라가 움직이도록 해야 한다. 두가지 방법을 소개하려고 한다.
첫번째 방법은 코드를 쓰지 않고 에디터를 활용해서 간단하게 구현하는 방법이다.
우선 카메라의 시점을 Scene View에서 조절해준 다음, 하이어라키 탭에서 카메라를 오브젝트에 넣어주는 방법이다.
이런식으로 카메라를 Vehicle 아래로 넣어준다면 카메라는 자동으로 Vehicle의 이동을 따라가게 되므로 자동으로 1인칭 시점이 구현된다.
두번째는 스크립트를 넣어서 제어하는 방법이다. 우선 카메라를 제어하기 위한 FollowPlayer 스크립트를 작성해준다.
update 메소드에서 카메라의 위치에 따라가려는 오브젝트의 위치를 대입하면 된다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class FollowPlayer : MonoBehaviour {
public GameObject player;
void Update() {
// follow player
transform.position = player.transform.position;
}
}
메인 카메라를 하이어라키에서 선택한 후 스크립트를 끌어다 놓으면 스크립트 컴포넌트가 추가된다.
여기서 player 선언부를 살펴보자면,
// 에디터에서 Object를 초기화할 수 있도록 public으로 선언
public GameObject player; // 따라갈 오브젝트
우선 씬에 있는 다른 오브젝트의 속성 (여기서는 위치)를 따오기 위해서 해당 오브젝트를 참조해야 한다. GameObject라는 클래스로 변수를 선언해주면 되는데, public 형을 사용하였다. 실제 오브젝트를 등록하는 방식에는 여러가지가 있는데, 그중 가장 간단한 방법이 에디터에서 설정하는 방식이기 때문이다. 에디터에서의 접근은 엄밀히 외부 접근이기 때문에 private 필드에는 접근할 수 없다.
[접근제어자를 생략한 경우 vs public으로 설정한 경우]
설정한 player 변수에 Vehicle 오브젝트를 끌어다 놓는 것으로 초기화를 할 수 있다.
플레이해보면 카메라가 오브젝트를 따라가는 것을 알 수 있다.
그러나, 이렇게만 하면 오브젝트와 카메라가 정확히 일치하기 때문에 원하는 시점이 나오지 않을 수 있다.
따라서 에디터에서 적당히 위치를 조정해본 후, 코드에 offset을 넣어준다. 나는 적당히 뒤에서 Vehicle을 보면서 따라가는 시점을 원했기 때문에, offset을 (0, 5, -7)으로 설정해주었다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class FollowPlayer : MonoBehaviour {
public GameObject player;
private Vector3 offset = new Vector3(0, 5, -7);
void Update() {
// offset the camera to put camera behind the vehicle
transform.position = player.transform.position + offset;
}
}
이렇게만 하면 화면이 약간 흔들려보일 수 있다.
그 이유는 Update문의 실행 순서와 관련이 있다. player 오브젝트가 실행한 후에 카메라가 따라가야 안정적인 화면이 나오는데, 카메라의 update문이 먼저 실행되는 경우가 생길 수 있다. 따라서, 카메라에서의 Update문을 LastUpdate로 바꿔준다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class FollowPlayer : MonoBehaviour {
public GameObject player;
private Vector3 offset = new Vector3(0, 5, -7);
// LateUpdate -> make sure that update after all other update happens
void LateUpdate() {
// offset the camera to put camera behind the vehicle
transform.position = player.transform.position + offset;
}
}
LastUpdate는 해당 프레임에서 Update문이 다 실행된 다음에 실행되기 때문에 이렇게 하면 안정적인 화면을 얻을 수 있다.