在FixedUpdate上使用Input.GetKey()是否真的错了?

Rob*_*rto 6 unity-game-engine

我们知道有一个"规则",Input功能不应该在内部使用FixedUpdate(); Input.GetKeyDown()如果我们这样做可能不起作用,但是使用它真的错了Input.GetKey()吗?

假设我们想要以某种不依赖于硬件性能的速率按住某个键来触发某些东西.我不想创建一个逻辑来控制它使用增量时间或写入密钥检测代码Update和激活代码FixedUpdate.

只做里面的一切都没有意义FixedUpdate吗?会发生什么 - 我们可能会失去一些关键的紧迫事件,即我们不想要的事情,以保持我们想要的速度.

但是,如果发生一个单一的关键事件,我们会失去它吗?之后是否有重置Update,所以我们不会看到它FixedUpdate

Jer*_*dak 9

来自GetKeyDown 文档:

您需要从Update函数调用此函数,因为每个帧都会重置状态

所以,是的,每个帧都会重置输入状态,这意味着硬件会产生影响,具体取决于它们Update之间的触发频率FixedUpdate.

确实没有一种简单的方法可以避免创建FixedUpdate使用的Input副本,尽管我建议重新评估您的逻辑以移动内容Update.

更新:

关于Rutter的评论如下.我刚刚注意到OP正在询问GetKey(),我写的内容GetKeyDown()仍然是正确的,GetKey()尽管文档没有明确说明.

这可以通过进入时间管理器并将FixedUpdate速率更改为某个长时间间隔(如1秒)来验证.然后做一些事情:

void FixedUpdate() {
    if(Input.GetKey(KeyCode.D)){
        Debug.Log("D-Key Down");
    } else {
        Debug.Log("No key down");
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您在1秒固定帧之间按下并释放"D",您将只看到"无按键".

  • @ BlueRaja-DannyPflughoeft令人怀疑.强制"更新"进入睡眠以模拟慢速帧速率显示键盘输入在后台排队.即使不是这种情况,输入也会在帧之间被清除,并且没有任何保证`FixedUpdate`将在任何特定帧中运行,而`Update`每帧保证一次.意思是"FixedUpdate"不应该用于输入. (4认同)
  • @Rutter感谢您指出我解决了错误的功能,请参阅我的更新.我怀疑这不是你注意到的默认0.02s固定费率,因为`GetKey`用于连续按键. (3认同)