유니티/이동

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

RꞮbble 2026. 5. 2. 22:31

 

정의

  • 선형 보간을 이용하여 시작점과 도착점 사이 좌표를 T(0~1 사이 비율값)값으로 위치를 계산해 오브젝트를 부드럽게 이동 
  • 고정된 좌표 이동이 아닌 현재 시점과 도착 시점의 보간된 좌표로 이동하는 방법 
  • 시작점과 도착점 사이를 비율(T)을 기반으로 위치를 계산하여 이동하는 것 

 
cf) Lerp = Linear Interpolation = 선형 보간 = 시작점과 끝점 사이 수치를 T(0~1 사이값)값에 따라 선형적으로 계산하는 것
cf) 왜 Vector3.Lerp 이동은 부드럽게 이동이 되는가? 
     -> 시작지점과 도착지점 사이를 비율(t)로 이동한다. 그렇기 때문에 시작점과 도착점 사이 무수히 많은 지점들을 프레임 단위로 이동한다. 이 지점들을 따라서 이동하니 부드럽게 이동하는 것처럼 보인다. 
 

사용 이유

  • 시작점에서 도착점까지 오브젝트를 부드럽게 이동시키기 위해서
  • 유니티 물리 엔진(Rigidbody)를 사용하지 않고 단순 이동을 구현할 수 있기 때문에 (성능 최적화)
  • 관성, 마찰력, 중력 영향 없이, 정확한 지점에 정확한 시간에 도착하게 만들기 위해서 
  • T값으로 진척도를 체크해 이벤트 처리를 하기 위해서
    • 목적지 도착 전후 이벤트 처리
      ex) 캐릭터가 목적지로부터 0.8(80%) 지점에 도착했을 때 먼지 이펙트를 나오게 하기.
      ex) MP UI가 오른쪽에서 왼쪽으로 이동하면서 UI 색상의 투명도를 줄이고자 할때 

 

언제 사용해야 하는가

  • 시작점과 도착점이 정해진 이동을 할때
    • UI가 특정 위치로 이동
  • 부드러운 이동을 해야할때
    • 물리 법칙이 필요없는 부드러운 이동
      • 체력바, SP바가 서서히 차오르거나 줄어드는 연출을 만들고자 할때
      • UI가 화면 밖에서 화면 안으로 들어오는 연출을 만들고자 할때 
    • 물리 법칙을 부드러운 이동으로 표현하고자 할때
      • 총을 쐈을 때 반동 위치까지 Lerp, 반동 위치에서 원래 위치까지 Lerp 
  • 카메라 이동처리를 할때
    • 카메라가 캐릭터를 부드럽게 따라가게 할때 
    • 카메라가 특정 지점을 부드럽게 비추고자 할때 

 

사용 방법

 
함수 정의

public static Vector3 Lerp(Vector3 a, Vector3 b, float t);
  • a = 시작 지점 위치 (Vector3)
  • b = 도착 지점 위치 (Vector3)
  • t = 비율 = 시작점(a)과 도착점(b) 사이 중 현재 어느 정도 진행되었는지에 대한 비율 (0~1 사이 값)

 
 
ex) 

using UnityEngine;

public class Example : MonoBehavioour
{
    public Vector3 startPos;
    public Vector3 endPos;
    private float _t;
    
    public float duration;
    public float timer = 0.0f;
    
    private void Update()
    {
        if(timer < duration)
        {
            timer += Time.deltaTime;
            
            _t = timer / duration; // 전체 시간 중 현재 얼마나 지났는지 비율 
            
            transform.position = Vector3.Lerp(startPos, endPos, _t);
        }
    }
}

 
 

Vector3.Lerp 이동 장점

  • 유니티 물리엔진(Rigidbody)을 사용하지 않아 성능 최적화에 좋다. 
  • 원하는 시간에 도착 지점까지 이동할 수 있다. 
    • t값을 "현재 시간 / 목표 시간"으로 설정하여 Lerp를 해주면 원하는 시간에 도착 지점까지 이동할 수 있음 
  • 가속 이동, 감속 이동이 가능하다.
    • t값을 제곱해 점점 빨라지게 만들 수 있다. 
      ex) Vector3.Lerp(startPos, endPos, t * t);
    • t값을 1 - (1 - t) * (1 - t)로 설정해 점점 느려지게 만들 수 있다. 
      ex) Vector3.Lerp(startPos, endPos, 1 - (1 - t) * (1 - t));

 

 

Vector3.Lerp 이동 단점

  • 유니티 물리엔진(Rigidbody)을 사용하지 않아 물리 현상이 무시된다. 
    • 물리 현상 = 물체와 부딪히기, 중력, 관성, 마찰력 등 
  • 직선 이동만 가능하다. 
  • Update에 종속적이다. 
    • Update 메서드에서 매 프레임 t값이 계산된다. 
      만약 프레임 드랍이 발생한다면 t값 계산이 이상해져 움직임이 끊겨 보인다. 
  • 기계적으로 이동하는 것처럼 보인다.