Menu
CoddyTech

부드러운 추적

Coddy Unity 여정의 물리와 게임플레이 섹션에 포함된 레슨. 63개 중 45번째.

LateUpdate()에서 오프셋을 더해 플레이어의 위치를 그대로 복사하는 카메라는 플레이어가 흔들릴 때마다 화면도 흔들리게 합니다. Vector3.SmoothDamp(current, target, ref velocity, smoothTime)는 감쇠하는 스프링이 움직이는 것처럼 target을 향해 이동한 위치를 반환합니다. 속도가 빨라졌다가 목표에 가까워지면서 느려지고, 목표를 지나치지 않고 도달합니다. 이 카메라는 플레이어보다 약간 늦게 따라가며, 플레이어보다 위로 3단위, 뒤로 6단위 떨어져 있습니다.

public Transform player;
public Vector3 offset = new Vector3(0, 3, -6);
public float smoothTime = 0.3f;
Vector3 velocity;

void LateUpdate()
{
    Vector3 target = player.position + offset;
    transform.position = Vector3.SmoothDamp(transform.position, target, ref velocity, smoothTime);
}

ref는 복사본이 아니라 변수 자체를 SmoothDamp에 전달하므로, 메서드가 해당 변수의 값을 바꿀 수 있습니다. SmoothDamp는 카메라의 현재 속도를 세 축 모두에 대해 velocity에 유지하며 다음 프레임에도 이 값이 필요하므로, 필드로 선언합니다. LateUpdate() 안에 선언하면 매 프레임 0부터 시작하므로 카메라는 프레임마다 약 0.5%씩만 이동하며 느리게 움직입니다. 카메라 줌처럼 단일 숫자에는 float 속도를 사용하는 Mathf.SmoothDamp가 같은 방식으로 작동합니다.

smoothTime은 카메라가 얼마나 뒤처지는지를 설정합니다. 값이 0.3이면 갑작스러운 이동의 약 60%를 0.3초 안에 따라잡으며, 1초 후에는 거의 도달합니다. 값이 작을수록 더 바짝 따라갑니다. SmoothDamp는 Time.deltaTime을 자체적으로 읽으므로, 호출의 어떤 값에도 이를 곱하지 않습니다.

challenge icon

챌린지

중급

카메라는 고정된 높이에서 플레이어를 내려다봅니다. Vector3.SmoothDamp와 smoothTime(0.25)를 사용해 부드럽게 따라가며 다음 위치로 이동하게 하세요.

  • x: 플레이어의 x;
  • z: 플레이어 뒤쪽으로, -z 방향으로 back(5) 단위;
  • y: 플레이어 자신의 높이에 상관없이 항상 height(12). 스페이스 키를 누르면 플레이어가 뛰어오르며, 화면은 위아래로 흔들리지 않아야 합니다.

Play를 누르고, 달리고 뛰어오른 다음 Check를 누르세요.

직접 해보기

using UnityEngine;

public class TopDownCamera : MonoBehaviour
{
    public Transform player;
    public float height = 12f;
    public float back = 5f;
    public float smoothTime = 0.25f;

    void LateUpdate()
    {
        // 고정된 높이에서 player의 위쪽 (x), 뒤로 back만큼 떨어진 (z) 위치를 향해 부드럽게 이동합니다.
    }
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

물리와 게임플레이의 모든 레슨