본문 바로가기

유니티 3D기본(Roll A Ball)

18. 카메라 이동으로 플레이어 따라가기

게임에서 흔히 보이는 3인칭 시점을 간단하게 구현해보겠습니다.

 

먼저 Scene창에서 카메라를 적당한 위치에 놓습니다.

 

플레이어 공이 움직이는 대로 카메라가 따라가려면 플레이어 공의 Position 정보를 카메라에도 줘야합니다.

C#스크립트를 생성해 카메라에 줍니다.

 

소스코드

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

public class CameraMove : MonoBehaviour
{

    Transform playerTransform; //Player의 transform 정보를 담을 변수 선언 

    void Awake()
    {
        playerTransform = GameObject.FindGameObjectWithTag("Player").transform; //GameObject의 메서드인 Find로 Player 오브젝트를 찾은 뒤 Position 정보를 가져옵니다.     
    }

    void LateUpdate() //카메라 움직임은 주로 LateUpdate에 적습니다.
    {
        transform.position = playerTransform.position; //카메라의 position에 player의 position 정보를 넣어줍니다.
    }
}

GameObject의 메서드인 Find로 다른 오브젝트를 찾아 필요한 정보를 가져올 수 있지만 Find는 cpu 부하가 높아 최적화를 고려한다면 권장되지 않는 방법입니다. 그리고 gameObject와 GameObject 혼동에 주의해주세요.

 

플레이를 해보면 이렇게 보입니다.

 

카메라는 분명 플레이어를 잘 따라가지만 이건 3인칭이 아닌 1인칭으로 보입니다.

3인칭이 되려면 카메라와 플레이어 사이에 거리를 둬야하는데 위 카메라의 소스코드는 카메라의 position과 플레이어의 position이 똑같기 때문에 마치 한몸처럼 1인칭 시점으로 보이는 겁니다.

 

따라서 소스코드에 거리 변수를 추가해야합니다.

 

소스코드

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

public class CameraMove : MonoBehaviour
{

    Transform playerTransform;
    Vector3 Offset; // 카메라와 플레이어 사이의 거리 변수

    void Awake()
    {
        playerTransform = GameObject.FindGameObjectWithTag("Player").transform;
        Offset = transform.position - playerTransform.position; //카메라 위치 - 플레이어 위치    
    }

    void LateUpdate() 
    {
        transform.position = playerTransform.position + Offset; //카메라 위치 = 플레이어 위치 + 거리
    }
}

 

결과

Scene에서 카메라를 놓은 위치를 기반으로 플레이어와의 거리를 계산하고 그 거리값을 계속 더해줌으로써, 카메라가 계속 일정거리를 유지하며 플레이어를 쫓아가게 되었습니다.