编辑:重新编写答案以更好地解释如何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
,或者换句话说,您可以得到一个 Vector3,从 V1 开始,以 perc 百分比更接近 V2。
现在,如果您想以固定步长将对象从 V1 移动到 V2,则每次Update()
调用都需要修改参数perc
。perc
例如,如果您想在 5 个单步内到达目的地,那么您需要使用以下:序列调用 Lerp 5 次0.2 - 0.4 - 0.6 - 0.8 - 1
。您想使用 10 步移动对象吗?然后你使用序列 0.1 - 0.2 - 0.3 等,你明白了。
但是这种处理方式给了你一个断断续续的动画,所以你想用传递的时间来计算perc
参数 every是多少Update
(示例代码在 Lukasz 提供的链接中)以获得从开始到的平滑线性运动结尾。
所以你的班级应该是这样的:
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);
}
}
}
使用 Lerp 移动对象的另一种方法是保持固定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 的第二次使用被特别指出(并且实际上被广泛使用)用于将摄像机移向游戏对象。