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);
}
이러한 방식으로 식이 짜여져있다고 가정을 합시다.
![](https://blog.kakaocdn.net/dn/Mchk7/btq1e6TEqfp/5GH6bN8FndnwfAGWqg76W0/img.png)
1프레임이 지나게되면 Update함수가 1번 실행되어서 다음과 같이 됩니다. t=0.8이라고 적힌 곳으로 a가 이동을 합니다.
그러면 다음 1프레임을 이동을 하면 어떻게 될까요?
![](https://blog.kakaocdn.net/dn/c33E6V/btq1e7E0bwB/oNcZHnG9JOvOZKk7xyntEK/img.png)
다음과 같이 될 것입니다. 그렇다면 다음은 더 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초씩 걸린다고 가정해봅시다.
![](https://blog.kakaocdn.net/dn/blHUW5/btq1b9XIdFH/y6jtP2CelJJDqTWRP8J9Nk/img.png)
a가 0.1만큼 이동을 하고
![](https://blog.kakaocdn.net/dn/dShndu/btq1jmaBSxd/p78ky9EMA9G9VQ5ahLA1NK/img.png)
Time.time의 값이 0.1에서 0.2로 커지기 때문에 이동하는 비율도 증가하게 됩니다.
그렇다면 Time.time이 1을 넘으면 어떻게 될까요?
b를 넘어서 a가 나아가게됩니다. 즉 1초가 지나게되면 Vector3의 x는 20.0을 넘게됩니다.
'Unity 게임 개발' 카테고리의 다른 글
C# Unity [SerializeField]와 [HideInInspector] (1) | 2021.04.19 |
---|---|
C# 추상메소드와 인터페이스 설명 (0) | 2021.04.14 |
Unity Time.realtimeSinceStartup 설명 및 공부 (0) | 2021.03.28 |
Unity time.time과 time.deltaTime의 설명 및 차이점 (0) | 2021.03.25 |
Unity Object.Instantiate() 설명 (0) | 2021.03.21 |