Vector3.Lerp 在 Unity3D 上协程内部无法正常工作

Vector3.Lerp inside a Coroutine is not working as it should on Unity3D

我在协同程序中使用 Vector3.Lerp 时遇到一个奇怪的问题,这没有任何意义,因为我的游戏中有很多协同程序,它们都工作正常。

我正在努力实现什么

我只是想通过一个名为 InVolo() 的协程将对象从 starting 高度移动到 final 高度和一个简单的 Vector3.Lerp 来改变对象的位置。

我的代码

float elapsedTime = 0f;

    while (elapsedTime < TempoSalita)
    {


        transform.position = Vector3.Lerp(transform.position, 
            new Vector3(transform.position.x, maxHight, transform.position.z), (elapsedTime / TempoSalita));


        elapsedTime += Time.deltaTime;

        yield return null;
    }

    transform.position = new Vector3(transform.position.x, maxHight, transform.position.z);
    yield return null;

maxHight就是4f,TempoSalita就是2f。协同程序在 OnTriggerEnter 中启动并且工作正常,对象到达 4f 的 y 并在 2 秒内退出 while。

问题

基本上,elapsedTime / TempoSalita 在 2 秒后变成 1,这是应该的,但是对象在大约 0.3 秒后到达结束位置,当 elapsed/TempoSalita 是 0.2,这对我来说毫无意义。 Vector3.Lerp 应该在 t 值的时间内从 startposendpos从 0 到 1。但它在 0.2 秒内到达最终位置,我不知道为什么。

我尝试了什么

我已经尝试 Debug.Log elapsedTime 并且它变化良好,尝试在 y 值之间仅使用 Mathf.Lerp 并且它做同样的事情。该脚本中没有其他任何东西可以影响它,协程是这样启动的:

 void OnTriggerEnter(Collider other)
{
    if(other.CompareTag("Saltino"))
    {
        StartCoroutine(InVolo());
        
    }
}

只启动一次。你知道什么会导致这个奇怪的问题吗?

可能是您使用的条件对我来说有点可疑。

通常我会写得有点不同,比如..

var t = 0f;
var start = transform.position;
var target = new Vector3(transform.position.x, maxHight, transform.position.z);

while (t < 1)
{
    t += Time.deltaTime / TempoSalita;

    if (t > 1) t = 1;

    transform.position = Vector3.Lerp(start, target, t);

    yield return null;
}

首先,您在更改位置之前创建了起始值和目标值。 t 值将增加,直到达到(或超过)1。由于我们不希望 t 超过 1,因此我们在应用 lerp 之前进行检查。我们的 t 值是在 lerp 之外计算的,以使其清晰易懂 read/modify.

以上将 运行 指定的时间,并且不需要在末尾添加额外的行,因为 t 最终将恰好为 1。