6

我们知道有一个“规则”,即Input函数不应该在FixedUpdate();中使用。Input.GetKeyDown()如果我们这样做可能不起作用,但使用它真的错了Input.GetKey()吗?

假设我们想在以某种不依赖于硬件性能的速率按住某个键时触发某些东西。我不想创建一个逻辑来使用增量时间或UpdateFixedUpdate.

只在里面做所有事情没有意义FixedUpdate吗?会发生什么 - 我们可能会丢失一些按键事件,这些事件是我们无论如何都不想要的,以保持我们想要的速率。

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

4

2 回答 2

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");
    }
}

如果您在 1 秒固定帧之间按下并释放“D”,您将只会看到“No Key Down”。

于 2013-10-08T22:43:59.833 回答
2

根据我的经验,更新发生在帧时,不像固定更新每帧可以发生多次。此外,对象的物理特性实际上是在调用 FixedUpdate() 之前更新的,这意味着根据场景的复杂性可能会有延迟。

我相信 Input 实际上是按帧广播的,所以当 FixedUpdate() 落后并且需要通过多次触发来赶上时,输入检查将失败。

其他资源:

http://answers.unity3d.com/questions/10993/whats-the-difference-between-update-and-fixedupdat.html

于 2013-10-08T22:51:43.613 回答