unity3d - 在FixedUpdate上使用Input.GetKey()真的错误吗?

标签 unity3d

我们知道有一个“规则”,即不应在Input内部使用FixedUpdate()函数;如果这样做,Input.GetKeyDown()可能无法正常工作,但是使用Input.GetKey()真的错误吗?

假设我们要以不依赖于硬件性能的某种速率按住某个键时触发一些操作。我不想创建逻辑来使用增量时间来控制此逻辑,也不想在o​​jit_code中编写 key 检测代码并在Update中编写触发代码。

只在FixedUpdate中做所有事情没有意义吗?可能发生的事情-我们可能会丢失一些按键事件(无论如何我们都不希望发生),以保持我们想要的速度。

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

最佳答案

GetKeyDown docs:

You need to call this function from the Update function, since the state gets reset each frame



因此,是的,每个帧都会重置Input状态,这意味着硬件将根据Update之间FixedUpdate触发的频率而产生效果。

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

更新:

关于以下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”,则只会看到“无键按下”。

关于unity3d - 在FixedUpdate上使用Input.GetKey()真的错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19259097/

相关文章:

c# - unity3d - 如何从 C# 脚本创建地形

c# - 重新启动按钮 Unity 3d C#

c# - 是什么导致 Unity 内存泄漏?

c# - Unity - SendMessage 但用于变量而不是函数/方法

c++ - 添加一个 child (引擎Unity like)

unity3d - Unity3d-构建Player : Win32Exception时出错

ios - 统一检查互联网连接可用性

c# - Unity3d 在构建后看不到项目文件夹中的 XML 文件

c# - SendMessage 不启动函数 (HoloLens/Unity/C#)

C#:科学记数法字符串到 Int64 的转换失败