【发布时间】:2021-10-29 14:47:30
【问题描述】:
我编写了一个“热键”类,它可以使用一些修饰键(shift、ctrl、cmd...)轻松评估单个给定键。
这个类能够像任何其他KeyControl 一样判断热键是被按下还是在当前帧上被按下/释放。当这些事情发生时,也能够发出 C# 事件。
代码就像一个魅力,除了一件事,例如,如果我想检查热键Ctrl+Z,我会创建这样的实例:var ctrlZ = new Hotkey(Key.Z, ModifierKeys.LeftShift);
(Key 是一个 Unity 枚举,ModifierKeys 是一个标记自定义枚举,它定义了最常用的修饰键)。
然后,要检查它,我只需要致电:if (ctrlZ.isPressed) { // code here... }
问题来了,例如,当我按下组合 Ctrl+Shift+Z 时,上面的代码在我不希望它的时候评估为 true,因为我需要用 Ctrl+Z 热键做一件事,而另一个用Ctrl+Shift+Z(重叠)。
我正在使用新的输入系统,并且,为了评估热键,我只是遍历修饰符 KeyControl 对象的列表,并检查它们是否与给定的 Key 同时按下。
那么问题是:我怎样才能防止这种重叠?
我尝试了最基本的解决方案,即将所有未使用的修饰符 KeyControl 对象添加到另一个列表并检查是否没有按下任何一个,但我想知道是否有比检查更简单有效的解决方案那样(它是在更新循环中完成的,因此,如果以这种方式评估许多热键,我认为它可能会导致一些开销)。
【问题讨论】: