[유니티] 카메라 추적 Follow Camera

안녕하세요 UnityBeginner입니다.
이번글에선 오브젝트를 추적하는 카메라에 방법에 대해 알아보겠습니다.


카메라는 주인공의 시점을 다루는 가장 중요한 요소중 1개입니다.
카메라를 어떻게 제어하느냐에 따라 1인창, 3인칭 등 다양한 뷰방식이 존재합니다.

씬뷰






빨간색 큐브는 키를 입력받고 이동할 플레이어 이며 
나머지는 단순한 바닥이 되어 줄 오브젝트입니다.

스크립트 Player

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public float speed;
    public float jumpPower;
    private Rigidbody rb;
   

    private void Awake() {
        rb = GetComponent();
    }

    void Update()
    {
        if(Input.GetKey(KeyCode.Space)) {
            rb.AddForce(Vector3.up * jumpPower);
        }

        if (Input.GetKey(KeyCode.LeftArrow)) {
            rb.AddForce(Vector3.left * speed);
        }

        if (Input.GetKey(KeyCode.RightArrow)) {
            rb.AddForce(Vector3.right * speed);
        }
    }

키를 입력받아 물체를 좌우로 이동, 점프하는 코드입니다.


스크립트 Camera


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
public Vector3 offset;
    public float followSpeed = 0.15f;

    private GameObject player;

    void Awake()
    {
        player = GameObject.Find("Player");
    }

    void FixedUpdate()
    {
        Vector3 camera_pos = transform.position = player.transform.position + offset;
        Vector3 lerp_pos = Vector3.Lerp(transform.position, camera_pos, followSpeed);
        transform.position = lerp_pos;
        transform.LookAt(player.transform);
    }

타겟을 추적하는 카메라 코드입니다.

offset을 이용한 기본간격 조정

단순하게 카메라의 위치를 플레이어의 좌표로 이동시킨다면
캐릭터와 카메라가 겹쳐지게되면서 1인칭 시점처럼 보일수도있지만
캐릭터의 크기에따라 캐릭터 내부가 겹쳐서 보이는 현상이 발생할수도있습니다.


lerp를 사용하여 선형보간

카메라가 플레이어를 따라오는거까진 성공했지만 플레이어의 이동속도가 빨라질수록
카메라가 순간이동 한다는 생각이 드실텐데 이럴때 Lerp를 사용하여 출발지점과
도착지점의 중간값을 구해 좀더 부드럽게 카메라를 이동할 수 있습니다.


LookAt을 이용

단순하게 카메라의 위치를 플레이어의 좌표로 이동시킨다면
캐릭터와 카메라가 겹쳐지게되면서 1인칭 시점처럼 보일수도있지만
캐릭터의 크기에따라 캐릭터 내부가 겹쳐서 보이는 현상이 발생할수도있습니다.
그래서 offset을 이용해 최초간격을 조정하여 올바른 시점이 되도록 합니다.

결과화면



영상을 마지막으로 카메라 추적에 대해 알아보았습니다. 위와 같은 기능을 응용하여 1인칭, 3인칭 탑뷰 등등 다양한 시점을 제어할 수 있습니다.

댓글