Unity Lerp 用法


建立時間: 2024年7月18日 02:49
更新時間: 2024年7月19日 02:50

說明

Lerp 指的是「線性插值」,本篇將告訴大家什麼是線性插值,以及說明官方文件的範例程式。

線性插值是什麼

最簡單的範例就是國中時期學過的 xy 平面的笛卡兒座標系,在上面畫一條線,求線段中某點的座標,就是線性插值,例如:求 x 座標等於 a 時,y 座標的值為多少。

Linear interpolation

上圖給予兩點 (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);
    }
}

參考

觀看次數: 272
lerpunity
按讚追蹤 Enjoy 軟體 Facebook 粉絲專頁
每週分享資訊技術

一杯咖啡的力量,勝過千言萬語的感謝。

支持我一杯咖啡,讓我繼續創作優質內容,與您分享更多知識與樂趣!