부드러운 추적
Coddy Unity 여정의 물리와 게임플레이 섹션에 포함된 레슨. 71개 중 47번째.
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%만큼씩 아주 느리게 움직입니다. 카메라의 줌처럼 하나의 숫자에는 Mathf.SmoothDamp를 같은 방식으로 사용할 수 있으며, 이때 속도는 float입니다.
smoothTime은 카메라가 얼마나 뒤처지는지 설정합니다. 값이 0.3이면 갑작스러운 점프 거리의 약 60%를 0.3초 동안 이동하고, 1초가 지나면 거의 도달합니다. 값이 작을수록 더 밀착해서 따라갑니다. SmoothDamp는 Time.deltaTime을 자체적으로 읽으므로, 호출에서 어떤 값에도 이를 곱하지 않습니다.
챌린지
중급카메라가 고정된 높이에서 플레이어를 부드럽게 따라가도록 만드세요.
Vector3 velocity;필드를 추가하세요.LateUpdate()에서Vector3 target = new Vector3(player.position.x, height, player.position.z - back);를 만들어 홉을 해도 시점이 움직이지 않도록 하세요.transform.position = Vector3.SmoothDamp(transform.position, target, ref velocity, smoothTime);를 설정하세요.
‘플레이’를 누르고 달리면서 홉을 해 보세요. 카메라가 약간 뒤따라오지만 위아래로 흔들리지는 않습니다. 그런 다음 ‘확인’을 누르세요.
직접 해보기
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)을 향해 부드럽게 이동합니다.
}
}
물리와 게임플레이의 모든 레슨
직접 연습해 보세요: Unity 플레이그라운드