Unity C#/개념 및 문법 정리

[Unity C#] Lerp 함수

routine96 2025. 1. 21. 19:28

Lerp 함수

Lerp함수는 선형 보간법을 사용한다.

선형 보간법 : 직선에 두 점이 주어졌을 때 그 사이에 위치한 값을 추정하기 위하여 직선 거리에 따라 선형적(비례적)으로 계산하는 방법

참고 자료 : https://ko.wikipedia.org/wiki/%EC%84%A0%ED%98%95_%EB%B3%B4%EA%B0%84%EB%B2%95

 

선형 보간법 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 선형 보간법(線型補間法, linear interpolation)은 끝점의 값이 주어졌을 때 그 사이에 위치한 값을 추정하기 위하여 직선 거리에 따라 선형적으로 계산하는 방법이

ko.wikipedia.org

 

그래서 이걸 유니티에서 어떤 방식으로 사용할까? 유니티에서 Lerp함수를 이용할 때는 자연스럽게 이동할 때 또는 자연스럽게 색이 변할 때 사용한다. 즉 스무스하게 이동, 변화에 사용한다.

 

 

예를 들어 물체의 위치를 자연스럽게 이동시키는 코드를 작성해보자

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

public class Lerp : MonoBehaviour
{
    Vector3 startPos; // 시작 위치 : a
    Vector3 targetPos = new Vector3(0, 5, 0); // 끝 위치 : b

    float currentTime = 0; // a와 b 사이를 선형보간하는 t

    void Start()
    {
        startPos = transform.position;
    }
    // Update is called once per frame
    void Update()
    {
        currentTime += Time.deltaTime;
        
        transform.position = Vector3.Lerp(startPos, targetPos, currentTime); // Vector3.Lerp(a, b, t)
    }
}

위 코드는 startPos에서 출발해 currentTime이 1초가 되면 targetPos 위치에 도착하게 된다. Vector3.Lerp(a, b, t)는 a부터 b까지 1초동안 간다고 가정했을 때 설정한 시간이 t일 때의 위치를 리턴해준다. 위 코드로 보면 0에서 5까지 1초 동안 이동하는 데에 있어서 t 시간일 때 위치를 반환해준다.

currentTime이 0.1이라고 가정하면 y의 위치 값은 y의 끝 위치 값인 5에 10분의 1인 0.5값을 반환해준다. currentTime이 Time.deltaTime만큼 증가하므로 매 프레임마다 값을 리턴해주는 것과 같다. 그리고 t의 값은 0 ~ 1로 고정된다. 0에서는 startPos를 1에서는 targetPos를 리턴한다.

 

 

예시로 큐브 2개를 생성하고 빨간 큐브와 파란 큐브로 구분해보자. 그리고 빨간 큐브의 startPos의 y 값을 0, targetPos의 y 값을 3으로 설정하고 파란 큐브의 startPos의 y 값을 0, targetPos의 y 값을 7로 설정한 후 결과를 봐보자.

실행 결과

 

결과를 본다면 모두 1초 뒤(동일한 시간)에 자신의 targetPos(빨간 큐브 = 3, 파란 큐브 = 7)에 도착한 것을 알 수 있다.

 

 

 

이것을 응용해 5초 뒤에 targetPos에 도착하는 코드를 작성해보자

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

public class Lerp : MonoBehaviour
{
    public float yPos;
    
    Vector3 startPos; // 시작 위치 : a
    Vector3 targetPos; // 끝 위치 : b

    float currentTime = 0; // a와 b 사이를 선형보간하는 t
    private float moveTime = 5.0f;

    void Start()
    {
        startPos = transform.position;
        targetPos = startPos + Vector3.up * yPos;
    }
    // Update is called once per frame
    void Update()
    {
        currentTime += Time.deltaTime;
        
        transform.position = Vector3.Lerp(startPos, targetPos, currentTime / moveTime); // Vector3.Lerp(a, b, t)
    }
}

 

 

Lerp 함수에서 currentTime에 5로 설정한 MoveTime을 나누어 준다면 startPos에서 targetPos까지 걸리는 시간 5초(정확히 5초는 아님)이다. 이렇게 시작 지점에서 끝 지점에 도착할 시간을 정할 수도 있고, 위치 뿐 아니라 빨간색에서 파란색으로 색을 변화한다고 했을 때 서서히 변하게 할 때도 Lerp함수를 이용한다.

 

 

Lerp함수를 이용한 큐브 위치와 색 변경

 

 

Lerp 유니티 공식 문서 : https://docs.unity3d.com/kr/current/ScriptReference/Mathf.Lerp.html

 

Mathf-Lerp - Unity 스크립팅 API

Linearly interpolates between a and b by t.

docs.unity3d.com