0

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

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

我读到你不能容忍否定,那么我该怎么做呢?

4

3 回答 3

6

我认为你使用 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 进行 lerp,然后将其设为负值。

    浮点数 = Mathf.Lerp(0f, 50f, t);

    随便=-随便;

于 2015-12-19T21:02:59.783 回答
2

好吧,实际上你不能。

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

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

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

于 2015-12-19T21:03:19.993 回答
2

tlerp 函数中的值介于a和之间,b通常需要在 0-1 范围内。当t为 0 时,函数返回a,当t为 1 时,函数返回b。in between的所有值都t将返回一个 betweenab作为线性函数的值。这是一个简化的一维 lerp:

return a + (b - a) * t;

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

0 + (4 - 0) * -0.01

返回-0.04

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

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

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

于 2015-12-19T21:05:24.147 回答