unity-game-engine - Mathf.Lerp 错过最终值

标签 unity-game-engine math lerp

我正在使用 Mathf.Lerp 来制作圆形进度条的动画。

进度条是一个具有名为“FillAmount”属性的图像:

0 means not filled
1 means filled

与填充属性“径向 360”一起,它的作用有点像时钟。

由于某种原因,执行 Lerp 函数后的最终值丢失了,我不知道如何改进该函数以最终得到预期的结果。

我的圆形进度条是 3/4 环,这就是为什么我将 uFrom 和 uTo(介于 0 到 100 之间)乘以 0.75。

这是我的代码:

public IEnumerator AnimateHealthChange(int uFrom, int uTo)
{
    float fFade = 0.25f;

    float fOld = ((uFrom * 0.75f) / 100);
    float fNew = ((uTo * 0.75f) / 100);

    Debug.Log("Changing from " + fOld.ToString() + " to " + fNew.ToString());

    for (float t = 0.01f; t < fFade; t += Time.deltaTime)
    {
        ImageHealthRing.fillAmount = Mathf.Lerp(fOld, fNew, Mathf.Min(1, t / fFade));
        yield return null;//
    }

    Debug.Log("Final filling after for-next-statement: " + ImageHealthRing.fillAmount.ToString());

    yield return null;
}

例如,当我调用 AnimateHealthChange(0, 100) 时,我会得到以下日志输出:

Changing from 0 to 0.75

Final filling after for-next-statement: 0.6807814

我预计最终结果为 0.75,而不是 0.6807814。

有人看到我的错误,还是我错误地使用了 Lerp?

enter image description here

最佳答案

您的for循环是一个问题,因为它不提供任何保证:

for (float t = 0.01f; t < fFade; t += Time.deltaTime)

Time.deltaTime可以是任何数字(取决于游戏的性能和帧速率)并且您正在使用 t < fFade而不是t <= fFade所以即使你这么做了,偶然也会得到 t == fFade ,(这是它应该结束以正确填充的值)它将跳过循环的迭代。

这里最简单的解决方案是在强制 fillAmount 的循环后面添加一个额外的语句。到适当的值:

    ...
    yield return null;//
}
ImageHealthRing.fillAmount = fNew;

这样,您的循环仍在处理动画,并且当您的函数结束时,您可以保证它以正确的值结束。

关于unity-game-engine - Mathf.Lerp 错过最终值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53382475/

相关文章:

unity-game-engine - 如何配置 Unity 和我的计算机以在 Oculus Go 上运行我的游戏/项目?

math - 如何将四元数与向量相乘?

c++ - 水平/垂直均匀分布网格单元?

math - 网格中的矩形 - 我需要有关边缘情况的帮助

python - 两点之间的等距点?

x86-64 - 带有 SSE 的 8 位 LERP

unity-game-engine - 如何在 Unity 的场景 View 中查看相机?

c# - Foreach 循环不前进也不抛出异常

c# - Unity 2D 中的运动卡顿

c++ - 符号性的线性插值优化