유니티/이동

[유니티(Unity)] 좌표이동 - Vector3.SmoothDamp 이동

RꞮbble 2026. 5. 6. 16:27


정의

  • 시작 지점에서 부드러운 가속으로 시작해 목표 지점에 가까워졌을 때 부드러운 감속으로 이동하는 방식 

 

Vector3.SmoothDamp VS Vector3.Lerp, Vector3.Slerp 

  Vector3.SmoothDamp 이동 Vector3.Lerp 이동 Vector3.Slerp 이동
이동 방식 목표 지점까지 부드러운 가속으로 시작해 부드러운 감속으로 이동 t(비율 값)에 따라 목표지점까지 이동 t(비율 값)에 따라 목표지점까지 이동 
목표지점이 바뀌면 관성을 유지하면서 새 목표지점을 향해 이동  즉시 새 목표지점을 향해 이동
(이때 끊기듯이 방향이 전환)
즉시 새 목표지점을 향해 이동
(이때 끊기듯이 방향이 전환)

 

 

사용 이유

  • 부드러운 추적
    • 추적하고 있는 목표 대상이 급격하게 속도가 변하거나 방향을 전환하더라도 관성을 유지하며 목표를 추적한다. 
  • 시각적 편안함
    • 출발할 때 서서히 빨라지고 멈출 때 서서히 느려지기 때문에 눈이 피로하지 않음
      ex) 카메라 추적 

 

언제 사용해야 하는가

  • 플레이어를 따라다니는 카메라를 구현해야 할때 (카메라 추적) 
    • 플레이어가 갑자기 방향을 전환하거나 속도가 올라가더라도 카메라가 자연스럽게 플레이어를 추적함. 
  • 캐릭터가 목표물 향해 고개를 돌릴 때 (시점 전환) 
    • 목표물이 캐릭터와 정반대 방향에 있을 때 부드럽게 방향 전환 
  • 부드럽게 열리고 닫히는 팝업UI
    • 열기 UI를 누르면 팝업 UI가 내려오고, 닫기 UI를 누르면 팝업 UI가 올라간다. 
      팝업 UI가 내려오는 도중 닫기 UI를 누르면 UI의 방향이 정반대로 전환이 된다.
      이것을 Vector3.SmoothDamp 이동으로 구현하면 관성을 유지하며 자연스럽게 이동가능하다. 

 

사용 방법

 
함수 정의

public static Vector3 SmoothDamp(Vector3 current, 
                                 Vector3 target, 
                                 ref Vector3 currentVelocity, 
                                 float smoothTime, 
                                 float maxSpeed = Mathf.Infinity, 
                                 float deltaTime = Time.deltaTime);
  • current = 현재 위치 (Vector3)
  • target = 목표 위치 (Vector3) 
  • currentVelocity = 이동 속도 (Vector3)
  • smoothTime = 목표 위치까지 도달 예상 시간 (작을수록 빨리 도착, 클수록 늦게 도착)
  • maxSpeed = 최대 속도 (기본값 = 무한대. 너무 빠르게 이동하는 것을 방지하고 싶으면 설정) 
  • deltaTime = 프레임 간격 (기본값 = Time.deltaTime. FixedUpdate에서 사용하는 것이 아니라면 그대로 두기.)

 
ex) 

using UnityEngine;

public class Example : MonoBehaviour
{
    public Transform endPos;
    public float smoothTime = 1.5f;

    private Vector3 _currentVelocity = Vector3.zero;

    private void Update()
    {
        transform.position = Vector3.SmoothDamp(transform.position,
                                                endPos.position,
                                                ref _currentVelocity,
                                                smoothTime);                  
    }
}

 

 

 

Vector3.SmoothDamp 이동 장점

  • 움직이는 목표물 추격에 좋다. 
    • 목표물이 속도를 급격하게 높이거나 방향을 바꾸더라도 부드럽게 이동한다. (끊기는 느낌 X)
  • 최대 속도를 설정할 수 있어 이동 속도에 제한을 줄 수 있다. 
    • Lerp, Slerp 이동은 거리가 멀수록 이동거리가 커지고 빠르게 이동한다. 
      이를 방지하기 위해서 Mathf.Clamp같은 코드를 추가해야 한다. 
      SmoothDamp는 maxSpeed만 설정해주면 알아서 이동해준다. 

 

Vector3.SmoothDamp 이동 단점

  • 작성중..