Unity3D C# 负 Lerp?

Unity3D C# Negative Lerp?

我想要 lerp 控制我的动画速度的变量,以便它在混合树中流畅地过渡。

 void Idle()
     {
         _agent.SetDestination(transform.position);
             //Something like the following line
         _speed = Mathf.Lerp(0.0f, _speed, -0.01f);
         _animationController._anim.SetFloat("Speed", _speed);
     }

我听说你不能检测底片,那么我该怎么做呢?

我觉得你用 Lerp 不好。

如 Unity 文档 (http://docs.unity3d.com/ScriptReference/Mathf.Lerp.html) 中所写,您应该传递 3 个浮点数,最小值作为第一个参数,最大值作为第二个参数,时间作为第三个参数。

第三个应该在 0 和 1 之间。

除此之外,你总是可以在 lerping 之后使数字为负数。

一些例子:

  • 如果你想要从 -10 到 10,从 0 到 20 插入,然后减去 10。

    随便浮动 = Mathf.Lerp(0f, 20f, t);

    随便 -= 10f;

  • 如果你想要从 0 到 -50,从 0 到 50 插入,然后将其设为负值。

    随便浮动 = Mathf.Lerp(0f, 50f, t);

    随便=-随便;

嗯,实际上你不能。

Lerp 函数的伪代码实现如下所示:

float Lerp(float begin, float end, float t)
{
    t = Mathf.Clamp(t, 0, 1);
    return begin * (1 - t) + end * t;
}

因此,任何试图给出 [0, 1] 之外的 t 值的尝试,即。外推尝试将被限制在有效范围内。

ab 之间的 lerp 函数中的 t 值通常需要在 0-1 范围内。当t为0时,函数returns a,当t为1时,函数returns bt 之间的所有值将 return 一个介于 ab 之间的值作为线性函数。这是一个简化的一维 lerp:

return a + (b - a) * t;

在这种情况下,t 的负值没有意义。例如,如果您的速度变量是 4.0flerp(0, 4, -0.01f) 的结果将是:

0 + (4 - 0) * -0.01

其中 returns -0.04.

解决此问题的最简单方法是简单地翻转 ab 而不是尝试使用负数 t.

_speed = Mathf.Lerp(_speed, 0.0f, 0.01f);

另一个建议是使用 Mathf.SmoothStep 并存储原始速度,而不是将函数应用于不断变化的 _speed 以获得真正平滑的过渡。