unity3d Unity c#:Lerp导致仓位疯狂

ruarlubt  于 2023-03-30  发布在  C#
关注(0)|答案(1)|浏览(145)

我在unity中创建了一个gunBob函数,还有一个叫做resetBob的函数(),将喷枪的当前位置在X和Y刻度上改为0位置,但不改为Z位置,以免与另一个函数冲突。()的功能是它做的第一件事。然而,每当它学习时,X和Y的值不为0,而是分别为-9.584906e-06和2.820429e-06。代码如下所示。

void gunBob()
    {
        resetBob();

        if (Input.GetAxisRaw("Horizontal") + Input.GetAxisRaw("Vertical") != 0)
        {
            float swayMultiplier = frequencyMultiplier();

            gunBobPos.x += Mathf.Cos(Time.time * (settings.frequency/2 * swayMultiplier)) * settings.amplitude/2;
            gunBobPos.y += Mathf.Sin(Time.time * (settings.frequency * swayMultiplier)) * settings.amplitude/2;
            gunBobPos.z = transform.localPosition.z;

            transform.localPosition = gunBobPos;
        }
    }

    void resetBob()
    {
        if (transform.localPosition != Vector3.zero)
        {
            transform.localPosition = Vector3.Lerp(transform.localPosition, new Vector3(0, 0, transform.localPosition.z), Time.deltaTime * 3f);
            gunBobPos = Vector3.zero;
        }
    }

我不知道是什么原因导致了这个问题,并且尝试了其他方法,比如在脚本开始时调用的变量中存储localPosition的值,但它都给出了完全相同的问题。

kq4fsx7k

kq4fsx7k1#

这取决于你想要达到的结果。
在我看来,你似乎不明白lerp是如何工作的。Lerp(a, b, t)根据t的值在ab之间插值。结果将是a(在t == 0的情况下)和b(在t == 1的情况下)。
在你的代码中,我看到你总是使用Time.deltaTime * 3作为t。在60 fps的情况下,它总是在0.1666 * 3左右。所以它永远不会是1,你的对象永远不会达到你的b值(在你的情况下是(0, 0, transform.localPosition.z))。这就是为什么你得到这些数字。

相关问题