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

时间:2013-10-08 21:49:39

标签: unity3d

我们知道有一条“规则”Input功能不应在FixedUpdate()内使用;如果我们这样做,Input.GetKeyDown()可能无效,但使用Input.GetKey()是否真的错了?

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

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

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

2 个答案:

答案 0 :(得分:9)

来自GetKeyDown docs

  

你需要从Update函数调用这个函数,因为   每个帧重置状态

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

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

<强>更新

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

这可以通过进入Time Manager并将FixedUpdate速率更改为某个较长的间隔(如1秒)来验证。然后做一些事情:

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

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

答案 1 :(得分:2)

根据我的经验,更新发生在帧时间,与固定更新不同,固定更新可能每帧发生多次。此外,在调用FixedUpdate()之前实际更新了对象的物理,这意味着可能会出现基于场景复杂性的延迟。

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

其他资源:

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