개인적으로 작업하면서 Scene 창을 봐도 되지만 Game 창을 자주 보는 편이다. 카메라 사이즈를 크게 해서 보기에도 눈아프고 카메라가 게임 오브젝트를 따라 다니는 걸 미리 만들어 놓는 게 작업하기 좋았다.
메인 카메라를 빈 게임 오브젝트를 따라 다니게 만들자

메인 카메라가 Anchor를 따라 다니게 만들었다. 물론 Anchor와 메인 카메라 Position을 적절하게 바꾸어 게임 화면을 보기 좋게 만들었다.
메인 카메라가 게임 오브젝트를 바로 따라다니면 카메라와 같은 라인(?)에 있는 게임 오브젝트는 게임 화면에 보이지 않는다. 그래서 따로 Position을 바꾸어 줘야 하는데 굳이 그럴 필요 없이 Anchor를 따라다니고 카메라의 위치를 띄어놓는 것이다.
기능은 스크립트로 제어한다
private Transform target;
public float smoothTime = 0.2f;
private Vector3 lastMovingVelocity;
private Vector3 targetPosition;
private Camera cam;
public float targetZoomSize = 5.0f;
private const float roundReadyZoomSize = 14.5f;
private const float readyShotZoomSize = 5.0f;
private const float trackingZoomSize = 10.0f;
private float lastZoomSpeed;
public enum State
{
Idle, Ready, Tracking
}
private State state
{
set
{
switch(value)
{
case State.Idle:
targetZoomSize = roundReadyZoomSize;
break;
case State.Ready:
targetZoomSize = readyShotZoomSize;
break;
case State.Tracking:
targetZoomSize = trackingZoomSize;
break;
}
}
}
void Awake()
{
cam = GetComponentInChildren<Camera>();
state = State.Idle;
}
void Start()
{
target = GameObject.Find("Player").GetComponent<Transform>();
}
private void FixedUpdate()
{
if(target != null)
{
Move();
Zoom();
}
}
private void Move()
{
targetPosition = target.transform.position;
Vector3 smoothPosition = Vector3.SmoothDamp(transform.position,
targetPosition, ref lastMovingVelocity, smoothTime);
transform.position = smoothPosition;
state = State.Tracking;
}
private void Zoom()
{
float smoothZoomSize = Mathf.SmoothDamp(cam.orthographicSize,
targetZoomSize, ref lastZoomSpeed, smoothTime);
cam.orthographicSize = smoothZoomSize;
}
코드에 대한 자세한 설명은 생략한다. 카메라에 3가지 상태(평시, 준비, 추적)를 주었고 각 상황에 따라 카메라의 상태를 바꾸어 줄 것이다.
지금은 Move 함수에서 카메라의 상태를 바꾸어서 게임을 실행하면 계속 추적 상태를 유지하지만 나중에 게임 매니저로 상태를 제어할 생각이다.