Unity Lerp 用法
分類
建立時間: 2024年7月18日 02:49
更新時間: 2024年7月19日 02:50
說明
Lerp 指的是「線性插值」,本篇將告訴大家什麼是線性插值,以及說明官方文件的範例程式。
線性插值是什麼
最簡單的範例就是國中時期學過的 xy 平面的笛卡兒座標系,在上面畫一條線,求線段中某點的座標,就是線性插值,例如:求 x 座標等於 a 時,y 座標的值為多少。
上圖給予兩點 (x0, y0), (x1, y1) 的直線上,取得 (x, y) 就是線性插值。
它不一定是直線,也可以是曲線,只是我用比較簡單的直線來說明。
Vector3.Lerp
宣告式
public static Vector3 Lerp(Vector3 a, Vector3 b, float t);
參數
參數 | 描述 |
---|---|
a | 起始值,當 t = 0 時傳回。 |
b | 最終值,當 t = 1 時傳回。 |
t | 用於 a 和 b 之間內插的值。 |
用法
如上線性插值的介紹,你可以拿來做平滑移動、平滑旋轉、顏色漸變、改變音量等等。
我在 Youtube 看到 Ketra Games 分享 Lerp 移動的教學,有一段告訴在我們錯誤的使用方式,其中之一就是帶入的參數,a
起始位置不要帶會一直改變的值 transform.position
,我大概猜得出原因是這條線一直在變化,導致線性插值會一直改變。最理想的應該是 a
不要改變,而是改變 t
,這樣才不會每次帶入相同的 t
卻得到不同的結果。
但錯誤不是指不能這樣用,而是指理解錯誤,如果你想要帶入一直改變的 a
也不是不行,在「咒術迴戰」動漫中有一個角色的招式是攻擊者一直無法碰到對方,攻擊者越靠近施術者,速度就會越慢,慢到趨近於靜止。
private void Update()
{
transform.position = Vector3.Lerp(transform.position, destination, Time.deltaTime)
}
上述就是這個效果的程式碼。
範例
// Vector3.Lerp 使用的更長範例。
// 將此腳本放在場景中的一個物件下,並在腳本檢查器視窗的「startMarker」/「endMarker」變數中指定另外 2 個物件。
// 播放時,腳本將沿著這兩個標記位置之間的路徑移動物件。
using UnityEngine;
using System.Collections;
public class ExampleClass : MonoBehaviour
{
// Transforms 作為旅程的起點和終點標記
public Transform startMarker;
public Transform endMarker;
// 移動速度(以每秒為單位)
public float speed = 1.0F;
// 移動開始的時間
private float startTime;
// 標記之間的總距離
private float journeyLength;
void Start()
{
// 記下移動開始的時間。
startTime = Time.time;
// 計算旅程長度
journeyLength = Vector3.Distance(startMarker.position, endMarker.position);
}
// 移動至目標結束位置
void Update()
{
// 移動的距離等於經過的時間乘以速度
float distCovered = (Time.time - startTime) * speed;
// 已完成旅程的分數等於目前距離除以總距離
float fractionOfJourney = distCovered / journeyLength;
// 將我們的位置設定為標記之間距離的分數。
transform.position = Vector3.Lerp(startMarker.position, endMarker.position, fractionOfJourney);
}
}
參考
觀看次數: 353
lerpunity
一杯咖啡的力量,勝過千言萬語的感謝。
支持我一杯咖啡,讓我繼續創作優質內容,與您分享更多知識與樂趣!