我有一个关于 Lerp 的问题。所以我知道 lerp 可以帮助你移动你的物体,比如:
void update(){
transform.position = vector3.lerp(start.position,end.position, (Time.time / 1000));
}
Run Code Online (Sandbox Code Playgroud)
这将使您的物体到达最终位置。但如果你有这样的代码:
void Update(){
transform.position = Vector3.Lerp(transform.position,
destination.position,
speed * 3.0f * Time.deltaTime);
}
Run Code Online (Sandbox Code Playgroud)
你的物体怎么可能到达目的地,lerp的第三个参数必须慢慢达到1,这样你的物体才能到达目的地。但是 "speed" 、 "3.0" 、 "Time.deltaTime" 总是相同的,那么你的对象怎么可能到达目的地呢?
所以最大的问题是:是否可以使用一些始终具有相同值的变量和 Time.deltaTime 来执行 lerp?
现在,由于不同的评论等,我不知道 lerp 是如何工作的,我有可能性:
1.)首先我认为它是这样工作的:
Vector3.lerp(a,b,c) c 值必须更改每一帧才能移动对象。如果 c 值为 0.2,则对象将移动 20% 的距离,如果 c 值不变,则对象将始终移动 20% 的距离。因此,要让对象流畅地移动,您的 c 值必须在每一帧稍微改变一点,这样您的 c 值将从 0 变为 1,并且您的对象从开始到目的地也是如此。
或者是这样的
2.)由于一些评论,我认为 lerp 是这样工作的
就像评论所说,c值不必改变值,因为如果你有c = 0.2,你将通过20%的方式和下一帧,如果c仍然是0.2,你将通过剩余的20%方式等等。
那么 lerp 是像 1 一样工作吗(你必须改变 c)还是像 2 一样工作(你不必改变 c)
变换位置和目的地之间的距离呈指数衰减。每帧距离缩小 (1 - 速度)(假设速度小于 1)。假设您的游戏应该以 60FPS 运行。如果由于某种原因帧速率下降到 30FPS,则 deltaTime 将变为原来的两倍,并且您\xe2\x80\x99 应该执行 Lerp 2 次。在这种情况下,距离将缩小 (1 - 速度),然后再次缩小 (1 - 速度),从而产生 (1 - 速度)^2 缩小的结果。由此,您可以归纳出距离的缩小量为 (1 - speed) ^ (deltaTime / baseDeltaTime),其中 baseDeltaTime 是游戏应该以 1/60(对于 60FPS)运行的 deltaTime。\n要输入代码:
\n\ntransform.position = Vector3.Lerp(transform.position, destination.position, 1 - Mathf.Pow(1 - speed * 3.0f, Time.deltaTime * 60));\n
Run Code Online (Sandbox Code Playgroud)\n