如果您需要更多上下文,请告诉我们。踢球计时器本身很好用。我试图这样做,以便在对象被踢到位之后一秒钟,它将以相反的方式踢回来。
subView
这样做的结果是,如果没有附加反冲功能,物体会比平时少。物体确实会反弹,但是在随机时间,而不是在它们踢起来后1秒钟。任何人都可以看到这个问题吗?
答案 0 :(得分:1)
当球被踢到空中时,计时器被重置,并且nextKick也被更改,因此在nextKick + 1发生时,您已经将nextKick的值更改为随机值。我想你想要的是public static IEnumerable<T> YieldMe<T>(this T obj)
{
yield return obj;
}
仅在第二个if语句之后/在回扣发生之后发生。
nextKick = Random.Range (MinKickTime, MaxKickTime);
您也可以使用一个计时器
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);
}
}
答案 1 :(得分:1)
你可能想做的是使用一个回拨时间队列,可以定义为:
Queue<float> nextKickBacks = new Queue<float>();
此外,我建议不要重置踢球计时器,但要有一个踢/踢回时间刻度,以便于参考。
最后,请考虑使用Time.deltaTime
代替Time.fixedDeltaTime
,因为它会自动返回正确类型的增量时间,如Unity Documentation中所述。
我相信,实现这一目标的一个巧妙方法如下:
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();
}
}
}
请注意,即使下一次踢球间隔低于一秒(这可能与您的旧概念有关),这种方法仍然有效。
UPD:如果您希望以改变的方式发生踢球/回扣,请确保MinKickTime
超过1。