Unity3d 随着时间的流逝

Unity3d 随着时间的流逝,unity3d,time,lerp,Unity3d,Time,Lerp,我有一个关于勒普的问题。所以我知道lerp可以帮助你移动物体,比如: void update(){ transform.position = vector3.lerp(start.position,end.position, (Time.time / 1000)); } 这将使对象到达终点位置。 但如果您有此代码: void Update(){ transform.position = Vector3.Lerp(transform.position,

我有一个关于勒普的问题。所以我知道lerp可以帮助你移动物体,比如:

void update(){
transform.position = vector3.lerp(start.position,end.position, (Time.time / 1000));
}
这将使对象到达终点位置。 但如果您有此代码:

void Update(){

    transform.position = Vector3.Lerp(transform.position,
                                      destination.position,
                                      speed * 3.0f * Time.deltaTime);
}
您的对象如何可能到达目的地,lerp的第3个参数必须缓慢地达到1,这样您的对象才能到达目的地。但是“速度”、“3.0”、“时间.延迟时间”总是一样的,那么你的物体怎么可能到达你的目的地呢

所以最大的问题是:有没有可能用一些变量来做lerp,这些变量的值和时间总是相同的

现在,由于不同的评论等,我不知道lerp是如何工作的,我必须:

1.)首先我认为它是这样工作的:

向量3.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)

对象达到目标,因为您的起始位置是当前位置,在lerp之后,您将对象的位置设置为lerp的结果位置。如果您将起始位置更改为普通矢量3,则会将Lerp更改为“speed*Time.deltaTime*3f”

我猜您不明白Lerp是如何在unity中工作的。我向你推荐这篇罗伯特的文章

我经常看到这种事情:

transform.position=Vector3.Lerp(startPos、endPos、Time.deltaTime)

发布它的人通常确信Vector3.Lerp是 “坏了”,但真正的问题是他们没有正确地使用它

Lerp,是“线性插值”的缩写,它做了一件非常简单的事情: 给定两个值x和y,它返回一个t%的值 在他们之间。如果您希望输出发生更改,那么您需要的参数 通过需要反映这一点

在上面的例子中,仅仅传入是没有意义的 Time.deltaTime,因为那只是在 最近的一帧。如果您的游戏以恒定的50fps运行,则 始终是0.02


变换位置与目标之间的距离呈指数衰减。距离每帧缩小(1-速度)(假设速度小于1)。假设你的游戏应该以每秒60帧的速度运行。如果出于任何原因,帧速率下降到30FPS,延迟时间将是原来的两倍,你应该执行2次Lerp。在这种情况下,距离将收缩(1速度),然后再次收缩(1速度),从而产生(1速度)^2收缩的结果。由此,您可以概括出距离的收缩量为(1-速度)^(deltaTime/baseDeltaTime),其中baseDeltaTime是游戏应该以1/60(60FPS)的速度运行的deltaTime。 要输入代码:

transform.position = Vector3.Lerp(transform.position, destination.position, 1 - Mathf.Pow(1 - speed * 3.0f, Time.deltaTime * 60));
如果将
Lerp
函数的返回值存储到一个变量中,然后在同一
Lerp
函数中将该变量用作最小值,则每次调用该函数时,最小值都会越来越大

所以,即使你没有改变T,你也在改变起始值,因此,存储的值越来越接近最大值

它最初会非常快地加速,然后越接近最大值就越慢。此外,可能永远无法达到最大值,也可能需要很长时间。

(请参阅)

有两种常用的方法可以使用
Lerp

1。起点和终点之间的线性混合

progress = Mathf.Clamp01(progress + speedPerTick);
current = Mathf.Lerp(start, end, progress);
2。指数级轻松实现目标

current = Mathf.Lerp(current, target, sharpnessPerTick);
请注意,在此版本中,
当前
值显示为输出和输入。它替换了
start
变量,因此我们总是从上次更新时移动到的任何位置开始。这就为这个版本的
Lerp
提供了从一帧到下一帧的内存。从这个移动的起点开始,我们然后将距离的一小部分移动到
目标
,该目标由
锐度
参数指定

这个参数不再是一个“速度”,因为我们以一种方式接近目标。如果
sharpnessPerTick
0.5
,那么在第一次更新时,我们将向目标迈进一半。然后在下一次更新时,我们将移动剩余距离的一半(即初始距离的四分之一)。然后下一次我们再移动一半


这提供了一种“指数级缓解”,当远离目标时,移动速度很快,当接近目标时,移动速度逐渐减慢(尽管在无限精度的情况下,它永远不会在任何有限的更新次数中到达目标-为了我们的目标,它已经足够接近目标)。它非常适合追踪移动目标值,或使用“,”平滑嘈杂的输入,通常使用非常小的
sharpnessPerTick
参数,如
0.1
或更小的参数。

请突出显示代码并按下
{}
按钮,确保正确格式化代码,我已经为您修复了它。另外,您可能对可能重复的代码问题很感兴趣。我知道如何使用lerp,但我想知道我是否可以使用变量,变量的值和时间总是相同的。deltaTime如果是,如何使用?不是它有帮助,而是它有帮助
current = Mathf.Lerp(current, target, sharpnessPerTick);