본문 바로가기

유니티 개발 정보/개념

Lerp

유니티를 사용할 때 많이들 유니티 공식홈페이지에서 제공하는 API 문서를 참조할 것이다.
하지만 모든 함수가 있을지 언정, 문서만 보고 이해가 쉽지 않은 API들이 몇개 있는데
오늘은 그중에서 Lerp에 대해서 알아보도록 하자.

Lerp는 선형보간(Linear Interpolation)을 나타낸다. 간단히 설명하면
점 p1에서 점 p2사이에 있는 점들에 대해서 시간의 변화에 따라서 해당 점들을 예측하는 것을 말한다.



유니티에서 Lerp함수는 보통 3개의 매개변수를 가진다.

1
2
3
4
5
// Example values
value1 = 10;
value2 = 20;
result = Mathf.Lerp(value1, value2, 0.5f);
// result == 15
cs

밑에 예제를 통해서, Lerp를 사용한 예시를 살펴보자.


위에서 보는 것처럼, 두 캐릭터가 왼쪽에서 오른쪽으로 동시에 움직인다.
그러나 움직이는 방식은 약간 다르다.

첫번째 방식(위 캐릭터)의 Lerp는 보통 “Smooth”라고 불린다. Smooth는 시작은 빠르지만, 도착지점에 가까워 질 수록 느려진다.
보통 게임 내에서 특정 속성에 대해 빠른 변화를 주려고 할 때, 사용하면 세련된 효과를 볼 수 있다.

1
2
3
4
5
6
void Update(){
    // From actual position to destination with "constant" t
    transform.position = Vector3.Lerp(transform.position,
                                      destination.position,
                                      speed * Time.deltaTime);
}
cs

위 코드가 Lerp의 핵심이라고 할 수 있다. 3개의 매개변수중 첫번째와 두번째 매개변수는
현재 위치와, 목적 위치를 차례로 나타낸다. 이 함수는 매 프레임마다 호출되고, 게임 오브젝트는 매프레임마다 움직이게 된다. 매 프레임마다 움직일 때, 현재 위치에서 목적 위치간의 남은 거리에서 특정 비율(세번째 매개변수)만큼 움직이게 된다. 이것은 수학적으론 오브젝트가 대상 위치에 도달 할 수 없다는 것을 의미한다.

두번째 방식은(아래 캐릭터)는 보통 “Constant”라고 불린다. 이는 캐릭터가 일정한 속력으로 움직이는 느낌을 준다. 이는 보통 특정 오브젝트의 움직임이 갑자기 빨리지는 것보다, 일관된 속도로 움직이게 하고 싶을 때 많이 사용되는 방법이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void Update(){
    // From position1 to position2 with increasing t
    transform.position = Vector3.Lerp(position1.position,
                                      position2.position,
                                      timer);
 
    // Increase or decrease the constant lerp timer
    if (destination == position1){
        // Go to position1 t = 0.0f
        timer = Mathf.Clamp(timer - Time.deltaTime * Speed, 0.0f, 1.0f);
    } else {
        // Go to position2 t = 1.0f
        timer = Mathf.Clamp(timer + Time.deltaTime * Speed, 0.0f, 1.0f);
    }
}
cs

이 코드는 첫번째 경우보다는 좀 복잡하지만, 차근차근 살펴보면 그렇게 어렵진 않다.
첫번째 시작점과 목직 지점이 항상 같고, 시간이 지남에 따라 비율이 일정하게 증가해서 일관된 속도로 항상 목적지에 도달하게 된다.
그리고 버튼을 누름에 따라 따라 timer값을 증가혹은 감소시켜, Lerp함수를 다시 호출하지 않고도, 캐릭터를 좌우로 움직일 수 있게 한 것이다.

마지막으로 Lerp가 유용한 점은, Vector, quaternions, Colors등 다양한 데이터형을 사용할 수 있다는 점이다.
밑에 예제는 “Smooth”방식으로 rotation과 color값을 Lerp함수를 통해 값을 변경하고 있다.

1
2
3
4
5
6
7
8
9
10
11
void Update (){
    // Lerp color
    spriteRenderer.color = Color.Lerp(spriteRenderer.color,
                                      destinationColor,
                                      speed * Time.deltaTime);
 
    // Lerp rotation
    transform.rotation = Quaternion.Lerp(transform.rotation,
                                         destinationRotation,
                                         speed * Time.deltaTime);
}
cs








참조

- 원문

- Vector3.Lerp (Unity 공식 API 문서)

- Mathf.Lerp (Unity 공식 API 문서)