編輯:重新寫的答案,如何更好地解釋Lerp
作品。
Lerp
以非常簡單的方式工作:我們稱之爲參數V1,V2和perc - result = Vector3.Lerp(V1, V2, perc)
。
比方說V1 = (0,0,0)
,V2 = (1,0,0)
和perc = 0,2f
。使用這些固定參數,您可以獲得result = 0.2f
,或者換句話說,從V1開始,您可以得到一個Vector3接近V2的百分比perc。
現在,如果要以固定的步驟將對象從V1移動到V2,則需要調用每個Update()
來修改參數perc
。例如,如果您想要以5個單一步驟到達目的地,那麼您需要使用以下序列perc
:0.2 - 0.4 - 0.6 - 0.8 - 1
調用Lerp 5次。你想用10步移動對象?然後你使用序列0.1 - 0.2 - 0.3等,你明白了。
但是做事情的這種方式給你一個波濤洶涌的動畫,所以要使用傳遞給計算多少時間是perc
參數每Update
(示例代碼是由盧卡斯提供的鏈接),以獲得平滑的和從頭到尾的線性運動。
所以,你的類應該是這樣的:
using UnityEngine;
public class PlayerControl : MonoBehaviour {
private float leftX = -1.65f;
private float leftY = 0.00f;
private float rightX = -1.00f;
private float rightY = -1.13f;
private float speed = 2f, startTime, totalDistance = 0f;
private Vector3 carPosition, startPos;
void Start() {
carPosition = transform.position;
startPos = carPosition;
}
void Update() {
if (Input.GetKeyDown (KeyCode.Space) || Input.GetMouseButtonDown (0)) {
Debug.Log ("Pressed!");
startTime = Time.time;
if (transform.position.y <= -0.5) {
startPos = transform.position;
carPosition.x = leftX;
carPosition.y = leftY;
}
if (transform.position.y >= 0) {
startPos = transform.position;
carPosition.x = rightX;
carPosition.y = rightY;
}
totalDistance = Vector3.Distance(startPos, carPosition);
}
if (startPos != carPosition) {
float newPercentageBetweenVectors = (Time.time - startTime) * speed/totalDistance;
transform.position = Vector3.Lerp (startPos, carPosition, newPercentageBetweenVectors);
}
}
}
使用線性插值到移動對象的另一種方法是保持一個固定的perc
和使用作爲第一個參數的對象的位置。這會給你一個對數類型的移動,開始時速度越快,越靠近目的地越慢,但要注意,由於它是一個漸近線,你永遠不會達到它 - 這意味着你需要自己檢查一下如果當前位置是足夠接近一個特定的距離的最終位置,例如10^-2,具有這樣的代碼:
using UnityEngine;
public class PlayerControl : MonoBehaviour {
private float leftX = -1.65f;
private float leftY = 0.00f;
private float rightX = -1.00f;
private float rightY = -1.13f;
private float speed = 2f, totalDistance;
private Vector3 carPosition;
void Start() {
carPosition = transform.position;
}
void Update() {
if (Input.GetKeyDown (KeyCode.Space) || Input.GetMouseButtonDown (0)) {
Debug.Log ("Pressed!");
if (transform.position.y <= -0.5) {
carPosition.x = leftX;
carPosition.y = leftY;
}
if (transform.position.y >= 0) {
carPosition.x = rightX;
carPosition.y = rightY;
}
}
if (transform.position != carPosition) {
transform.position = Vector3.Lerp (transform.position, carPosition, speed * Time.deltaTime);
totalDistance = Vector3.Distance(transform.position, carPosition);
if (totalDistance < Mathf.Pow(10,-2)) transform.position = carPosition;
}
}
}
在這種情況下使用的Time.deltaTime
是沒有必要的,如果提供了足夠低speed
。 這個第二次使用Lerp特別指出(並且實際上廣泛使用)將相機移動到遊戲對象。
Lerp不是一個單一的步驟如果你想要這種行爲,請使用MoveTowards – CaTs
當然,我用一個不恰當的方式使用術語步驟,我將編輯我的答案以更好地解釋Lerp是如何工作的。 – Galandil
非常感謝你的工作。因爲我是Unity的新手,Lerp的概念對於我的項目來說很難理解,你提供的答案對我來說很重要,但對我來說卻很小,但我理解了它背後的邏輯。我猜我需要學習很多東西。你的答案真的很感激。 – pijushmandal