Transform.up工作,1秒后的-Transform.up工作不好?C#Unity
本文关键字:工作 up C#Unity -Transform 1秒 Transform | 更新日期: 2023-09-27 18:27:11
如果您需要更多上下文,请告诉我。踢腿计时器本身就很好用。我试着让它在物体被踢到位一秒钟后,它会以相反的方式被踢回来。
void FixedUpdate()
{
kickTimer += Time.fixedDeltaTime;
if (kickTimer > nextKick) {
rb.AddForce (transform.up * thrust, ForceMode.Impulse);
kickTimer = 0;
nextKick = Random.Range (MinKickTime, MaxKickTime);
}
kickBackTimer += Time.fixedDeltaTime;
if (kickBackTimer > nextKick + 1) {
rb.AddForce (-transform.up * thrust, ForceMode.Impulse);
kickTimer = 0;
nextKick = Random.Range (MinKickTime, MaxKickTime);
}
}
这样做的结果是,如果没有附加回踢功能,对象会比正常情况下踢得更少。这些物体确实会向后踢,但是随机的,在它们踢起后不到1秒。有人能看出这个问题吗?
您可能想在这里使用一个反冲时间队列,它可以定义为:
Queue<float> nextKickBacks = new Queue<float>();
此外,我建议不要重置踢球计时器,而是使用一个单独的踢球/回踢时间刻度,以便于参考。
最后,考虑使用Time.deltaTime
而不是Time.fixedDeltaTime
,因为它将自动返回正确类型的delta时间,如Unity文档中所述。
我相信,实现这一目标的一个巧妙方法是:
void FixedUpdate()
{
// Increase the kick timer
kickTimer += Time.deltaTime;
// If the next kick time has came
if (nextKick < kickTimer) {
// Schedule the kick back corresponding to the current kick
nextKickBacks.Enqueue(nextKick + 1);
// Apply the kick force
rb.AddForce(transform.up * thrust, ForceMode.Impulse);
// Plan the next kick
nextKick = kickTimer + Random.Range(MinKickTime, MaxKickTime);
}
// If there are more kick backs to go, and the time of the closest one has came
if (0 < nextKickBacks.Count) {
if (nextKickBacks.Peek() < kickTimer) {
// Apply the kick back force
rb.AddForce(-transform.up * thrust, ForceMode.Impulse);
// Dequeue the used kick back time
nextKickBacks.Dequeue();
}
}
}
还请注意,即使下一次踢球间隔低于1秒(这可能与您的旧概念有问题),这种方法也有效。
UPD:如果您希望踢球/踢球以改变的方式发生,请确保MinKickTime
大于1。
当球被踢到空中时,计时器会重置,nextKick也会更改,因此当nextKick+1发生时,您已经将nextKick的值更改为随机值。我认为你想要的是nextKick = Random.Range (MinKickTime, MaxKickTime);
只出现在第二个if语句之后/回扣发生之后。
void FixedUpdate()
{
kickTimer += Time.fixedDeltaTime;
if (kickTimer > nextKick) {
rb.AddForce (transform.up * thrust, ForceMode.Impulse);
kickTimer = 0;
}
kickBackTimer += Time.fixedDeltaTime;
if (kickBackTimer > nextKick + 1) {
rb.AddForce (-transform.up * thrust, ForceMode.Impulse);
kickTimer = 0;
nextKick = Random.Range (MinKickTime, MaxKickTime);
}
}
你也可以只使用一个定时器
void FixedUpdate()
{
kickTimer += Time.fixedDeltaTime;
if (kickTimer > nextKick) {
rb.AddForce (transform.up * thrust, ForceMode.Impulse);
}
if (kickTimer > nextKick + 1) {
rb.AddForce (-transform.up * thrust, ForceMode.Impulse);
kickTimer = 0;
nextKick = Random.Range (MinKickTime, MaxKickTime);
}
}