我在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的值,但它都给出了完全相同的问题。
1条答案
按热度按时间kq4fsx7k1#
这取决于你想要达到的结果。
在我看来,你似乎不明白lerp是如何工作的。
Lerp(a, b, t)
根据t
的值在a
和b
之间插值。结果将是a
(在t == 0
的情况下)和b
(在t == 1
的情况下)。在你的代码中,我看到你总是使用
Time.deltaTime * 3
作为t
。在60 fps的情况下,它总是在0.1666 * 3
左右。所以它永远不会是1
,你的对象永远不会达到你的b
值(在你的情况下是(0, 0, transform.localPosition.z)
)。这就是为什么你得到这些数字。