본문 바로가기

Unity

[Unity] 캐릭터 이동 시 카메라 따라가기 (3인칭)

캐릭터 이동을 구현하였으니, 이제 카메라가 캐릭터를 따라다닐 수 있도록 구현해봅시다. 

 

 이전에 만들었던 Scripts 폴더에 MainCamera_Action이라는 스크립트를 생성해줍니다. 이후 다음과 같이 코드를 작성해줍시다.

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

public class MainCamera_Action : MonoBehaviour
{
    public GameObject Target;               // 카메라가 따라다닐 타겟

    public float offsetX = 0.0f;            // 카메라의 x좌표
    public float offsetY = 10.0f;           // 카메라의 y좌표
    public float offsetZ = -10.0f;          // 카메라의 z좌표

    public float CameraSpeed = 10.0f;       // 카메라의 속도
    Vector3 TargetPos;                      // 타겟의 위치

    // Update is called once per frame
    void FixedUpdate()
    {
        // 타겟의 x, y, z 좌표에 카메라의 좌표를 더하여 카메라의 위치를 결정
        TargetPos = new Vector3(
            Target.transform.position.x + offsetX,
            Target.transform.position.y + offsetY,
            Target.transform.position.z + offsetZ
            );

        // 카메라의 움직임을 부드럽게 하는 함수(Lerp)
        transform.position = Vector3.Lerp(transform.position, TargetPos, Time.deltaTime * CameraSpeed);
    }
}

 

 offset 변수들은 "타겟으로부터의 카메라의 위치"를 의미합니다. 즉 위의 코드는 타겟으로부터 (0, 10, -10)의 위치에 카메라가 위치한다는 뜻이 됩니다. public으로 설정하여 유니티 내부에서 간편히 변경할 수 있도록 해주었습니다.

 

 카메라의 각도 또한 설정해야 하는데, 이는 유니티 내부에서 카메라의 각도를 직접 조정하는 방법이 가장 편하므로 굳이 스크립트로 작성하지 않았습니다만, 스크립트를 쓰시고 싶다면 위의 코드에 다음 코드를 덧붙여주시면 됩니다.

// ... 는 상기 코드와 동일한 부분입니다.
public class MainCamera_Action : MonoBehaviour
{
    //...

    public float angleX = 0.0f;
    public float angleY = 0.0f;
    public float angleZ = 0.0f;
	
    //...

    // Update is called once per frame
    void FixedUpdate()
    {
        //... 
        transform.rotation = Quaternion.Euler(angleX, angleY, angleZ);
    }
}

 angle 변수를 사용하여 카메라의 각도를 지정해주시면 됩니다.

 

 여기에서도 FixedUpdate를 사용했습니다. FixedUpdate를 이동하는 물체에 사용하는 이유는 Update와 달리 프레임의 영항을 받지 않기 때문이라고 합니다. 즉 이동 시 버벅거릴 수 있는 현상을 좀 더 보정해준다는 뜻으로 이해할 수 있겠습니다. 

 

 위에서 설정한 offset 변수들을 TargetPos의 각 x, y, z에 더하여줍니다. 이 작업을 통해 카메라가 가야 할 위치가 계속해서 업데이트됩니다.

 

 이제 카메라의 위치로 이동시킬 차례입니다. 해당 포스팅에서는 카메라가 부드럽게 이동할 수 있도록 Lerp를 사용한 방식으로 스크립트를 작성하였습니다. Lerp에 관한 설명은 mayquartet.tistory.com/44의 마지막 부분에 있습니다.

 

[Unity] 캐릭터가 바라보는 방향으로 회전

이번에는 캐릭터가 바라보는 방향으로 회전할 수 있도록 스크립트를 수정해보겠습니다. 캐릭터가 바라보는 방향을 알 수 있도록 3D Object에서 Cube를 하나 추가해준 후 다음과 같이 설정합니다.

mayquartet.tistory.com

 

 더욱 자세한 설명을 원하신다면 docs.unity3d.com/kr/530/ScriptReference/Mathf.Lerp.html을 참고하시는 것도 좋을 것 같습니다.

 

Unity - 스크립팅 API: Mathf.Lerp

public static function Lerp(a: float, b: float, t: float): float; public static float Lerp(float a, float b, float t);

docs.unity3d.com

 

이렇게 스크립트를 다 작성했다면 유니티 화면으로 가서 MainCamera_Action 스크립트를 Main Camera에 부여해주도록 합시다.

 

 스크립트를 부여했다면 카메라가 따라다닐 타겟을 지정해주도록 합시다. 여기에서는 Player를 따라다닐 것이므로 Player를 스크립트의 Target에 넣어주도록 합시다.

 

 이제 유니티를 실행하면 카메라가 플레이어를 따라다니는 것을 볼 수 있습니다.