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 유니티 공식 문서 : 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
'Unity C# > 개념 및 문법 정리' 카테고리의 다른 글
[Unity C#] 람다식(Lambda Expression) 기초 개념 (0) | 2025.01.27 |
---|---|
[Unity C#] Delegate (대리자), Delegate Chain 기본 개념 (0) | 2025.01.25 |
[Unity C#] Time.deltaTime (0) | 2025.01.21 |
[Unity C#] 객체 지향 _ 상속(추상 클래스, 인터페이스, 다중 상속) (1) | 2025.01.17 |
[Unity C#] 객체 지향 _ 다형성 (0) | 2025.01.16 |