如何为UnityEngine.UI.Button.onClick实现防抖处理?
老旧磨损的控制器偶尔会出现单次按压触发多次按键输入的情况,我已经掌握了自定义游戏逻辑里的处理方法。
但针对Unity UI组件(尤其是按钮),还没找到简洁的防抖方案。这里的防抖是指消除输入中的无效噪声,避免过度触发——正常单次按键应该只触发一次,但故障控制器可能会识别成按下、抬起、再次按下。解决思路是在按键触发后的短时间内(比如0.2秒)忽略输入,而且只能针对UI及特定操作,全局禁用输入不可行。
我的菜单按钮用UnityEngine.UI.Button.onClick事件调用GameObject.SetActive(),直接在Inspector窗口把不同GameObject拖进按钮组件的On Click ()事件栏,实现子菜单切换,这种方式比纯代码实现更方便。
但因为没有防抖处理,用老旧Xbox One控制器操作时,本来应该只打开一个子菜单,结果会连续切换两个甚至触发第三个菜单的操作。
多数商业游戏里这个问题不明显,我自己的游戏里部分菜单也不受影响:切换到新屏幕时有淡入淡出效果,还需要实例化新菜单,就算没有防抖也不会误触发;但子菜单没有这类过渡效果,问题就凸显出来了。
我知道可以在Inspector的onClick事件里调用自定义的OnButtonClick()方法来实现防抖,但这种方式不够便捷,而且防抖应该属于基础功能,想找更简洁的方案。
我也曾考虑重写UnityEngine.UI.Button.onClick,但这需要把所有Button组件都替换成自定义的DebounceButton组件,同样不够简洁。
我用的是Unity 2021.3.6f1和Rewired v1.1.44.0,求更优解。
内容的提问来源于stack exchange,提问作者johnfernow

