본문 바로가기
Unity 게임 개발

Unity Mathf.Lerp 공부

by daisy0461 2021. 3. 29.

docs.unity3d.com/ScriptReference/Mathf.Lerp.html

Unity - Scripting API: Mathf.Lerp

public static float Lerp(float a, float b, float t);

docs.unity3d.com

2020.3 버전 API입니다.

public static float Lerp (float a , float b , float t );

다음과 같이 사용을 합니다.


각 매개변수에 대해서 알아보자면

a 시작하는 값
b 끝나는 값
t a와 b사이의 보간 값

return 값은 a,,b 사이의 보간 된 결과입니다.


위에서 뜬금없이 나오는 단어가 있습니다. '보간'이라는 단어입니다. 이 '보간'의 의미를 알아야 이 함수를 잘 이해를 하고 쓸 수 있을 것 같아서 간단하게 정리를 해보겠습니다.

수학적인 개념이 강해서 정말 정밀하게 보고 싶은 분들은 아래 링크로가서 봐주시면 됩니다.
darkpgmr.tistory.com/117

선형 보간법(linear, bilinear, trilinear interpolation)

이 글은 1D 선형보간법(linear interpolation)을 2D로 확장한 bilinear interpolation과 3D로 확장한 trilinear interpolation이 어떤 식으로 이루어지는지와 이러한 interpolation 기법이 히스토그램(histogram)..

darkpgmr.tistory.com

제가 소개할 방식인 간단한 방식은 그림으로 알려드리겠습니다.

void Updata(){
	//a=0, b=1이라고 가정합니다.
	a = Mathf.Lerp(a, b, 0.8f);
}

이러한 방식으로 식이 짜여져있다고 가정을 합시다.

1프레임이 지나게되면 Update함수가 1번 실행되어서 다음과 같이 됩니다. t=0.8이라고 적힌 곳으로 a가 이동을 합니다.
그러면 다음 1프레임을 이동을 하면 어떻게 될까요?

다음과 같이 될 것입니다. 그렇다면 다음은 더 b와 가깝게 될 것이라고 생각할 수 있습니다.
이러한 방식으로 이해를 한다면 어렵지 않을 것입니다.

색다르게 생각을 해서 t=0이면 항상 a랑 동일할 것이고 t=1이면 b랑 동일하게 될 것입니다.
혹시 t <= 0이라면 절대 b로 도달할 수 없습니다.
구하는 값이 a와 b사이의 값을 return하기 때문에 b로는 도달할 수 없는 것입니다.
그렇다면 멈추기 위해서는 어떻게 해야할까?
a값이 바뀐다고 했으니까 다음과 같이 고치면 될 것입니다.

void Updata(){
	//a=0, b=1이라고 가정합니다.
    if(a<0.9999f){
		a = Mathf.Lerp(a, b, 0.8f);
    }else{
    	a = b;
    }
    

}

다음과 같이 식을 만든다면 최소한의 오차로 a를 b에 도달하도록 할 수 있습니다.

API에 있는 식으로 이해를 해보겠습니다.

using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour {
    public float minimum = 10.0F;
    public float maximum = 20.0F;
    void Update() {
        transform.position = new Vector3(Mathf.Lerp(minimum, maximum, Time.time), 0, 0);
    }
}

위와 같이 식을 만들면 어떻게 될까요?
10.0f에서 시작을 해서 20.0만큼 Time.time에 맞춰서 이동을 하게 됩니다.
예시를 다시 그림으로 그려보자면 1프레임에 0.1초씩 걸린다고 가정해봅시다.

a가 0.1만큼 이동을 하고

Time.time의 값이 0.1에서 0.2로 커지기 때문에 이동하는 비율도 증가하게 됩니다.
그렇다면 Time.time이 1을 넘으면 어떻게 될까요?
b를 넘어서 a가 나아가게됩니다. 즉 1초가 지나게되면 Vector3의 x는 20.0을 넘게됩니다.