Lerp함수에 대하여
위 링크의 블로그를 보면 Lerp(선형보간)에 대해 자세한 설명이 적혀있습니다.
위 블로그링크에서는 Vector3.Lerp()함수를 기준으로 설명하고 있습니다.
선형보간이란
a, b값이 주어졌을 때 그 사이에 위치한 값을 추정하기 위하여 직선 거리에 따라 선형적으로 계산하는 방법입니다.
유니티에서의 선형보간 함수를 사용할때 파라미터는 다음과 같습니다.
- a: 일차 함수의 시작 값
- b: 일차 함수의 끝값
- t: 얻고 싶은 값의 위치. (비율로 나타냄. 예를 들어 일차 함수의 중간 값을 얻고 싶으면 파라미터에 0.5를 넣으면 됩니다.)
즉, 선형보간 함수는 찾고 싶은 일부지점을 비율(t)로 표시하여 값을 예측해서 받아옵니다.
선형보간 함수는 밑의 자료형들에서 각각 가지고 있습니다.
Mathf.Lerp() //숫자 간의 선형 보간
Vector2.Lerp() //Vector2간의 선형 보간
Vector3.Lerp() //Vector3간의 선형 보간
Quaternion.Lerp() //Quaternion 간의 선형 보간
Lerp의 예시
한 번 Lerp의 사용예시를 들어보겠습니다.
Vector2의 Lerp함수를 사용한 예시를 들어보겠습니다. Vector2.Lerp() 함수의 return type은 Vector2값입니다.
Vector2 pos = Vector2.Lerp(new Vector2(0, 0), new Vector2(100, 100), 0.5);
위의 코드가 실행되면 pos 변수에 Vector2(50, 50)의 값이 반환됩니다.
그러면 이 특성을 이용해서, t값을 0.0부터 1.0까지 스무스하게 올려주면, 일차함수에 위치한 point들을 작은 간격 단위로 가져올 수 있다고 생각할 수 있습니다.
using UnityEngine;
public class Example : MonoBehaviour
{
public Vector2 destination;
void Update()
{
//Moves the GameObject from it's current position to destination over time
transform.position = Vector2.Lerp(transform.position, destination, Time.deltaTime);
}
}
이처럼 Update함수에서 Lerp함수를 통해 t값을 서서히 올리면 작은 간격 단위로 position을 가져올 수 있고, 이는 물체의 position이 부드럽게 움직이는 것처럼 보이는 효과를 만들 수 있습니다.
공식 문서에서 확인하는 Vector3.Lerp()함수
docs.unity3d.com/ScriptReference/Vector3.Lerp.html
함수형태
public static Vector3 Lerp(Vector3 a, Vector3 b, float t);
파라미터
a | 시작 값. t=0일 때 반환됩니다. |
b | 끝 값. t=1일 때 반환됩니다. |
t | a와 b사이를 보간될 때 사용되는 값입니다. |
설명
두 점 사이에서 선형보간합니다.
보간값 T로 a와 b사이를 보간합니다. t값의 범위는 0~1사이로 고정됩니다. 이것은 두 끝점 사이의 선을 따라 일부 지점을 찾는 데 가장 일반적으로 사용됩니다.
Returns
a + (b - a) * t를 통해 보간된 값이 Vector3 타입으로 반환됩니다.
(수식은 a * (1-t) + b * t 으로 대체하여 사용할 수도 있습니다.)
t에 따른 반환값
Vector3.Lerp(a, b, t)
t = 0 일 때 | a를 반환한다. |
t = 1 일 때 | b를 반환한다. |
t = 0.5 일 때 | a와 b사이의 중간지점을 반환한다. |
정리
Vector3.Lerp(a, b, Time.deltatime)
Vector3.Lerp(a, b, Time.deltatime * 2f) 등 여러 형태로 t값을 조절해줄 수 있습니다.
즉, a값으로 반환되는 값은 a + (b-a) * t이며 점진적으로 a값이 증가할 것을 예상할 수 있습니다. a의 증가폭은 점점 줄어들면서 b값까지 도달하게 되는데 즉, 도착위치에 가까워질수록 속도가 느려집니다.
t값에 deltatime을 넣는 것 말고도 공식 레퍼런스에 다양한 방법이 있으니 원하는 속도가 나올 수 있도록 본인이 개선해서 사용하면 될 것 같습니다.
'유니티에서 게임개발을 추구하면 안되는걸까' 카테고리의 다른 글
[Unity] GameObject 코드에서 생성 (0) | 2021.04.18 |
---|---|
[Unity] 비활성화 된 GameObject찾기 (2) | 2021.04.05 |
[Unity] Object.Instantiate 함수 (자동 world space좌표로 변환) (0) | 2021.03.21 |
[Unity] SetActive와 enabled (0) | 2021.03.05 |
[Unity] RequireComponent란? (0) | 2021.03.05 |