Unity新Input UI系统中OnPointerClick单次点击触发两次如何解决
Unity新Input UI系统单次点击触发两次OnPointerClick解决方案
常见原因及对应解决方法
- 脚本重复挂载
检查当前按钮对象以及其所有父级对象,确认是否重复挂载了ClickableButtons脚本,或者多个实现了IPointerClickHandler接口的脚本。UI点击事件会向上冒泡,父对象挂载的同类型回调也会被触发,删除多余的重复脚本即可解决。 - 双输入系统同时启用
如果你在Player Settings中将Active Input Handling设置为Both,旧Input Manager和新Input System会同时抛出点击事件,导致回调触发两次。解决方法是将该项修改为你正在使用的输入模式(仅选新Input System即可),重启Unity编辑器后生效。 - 场景存在多个EventSystem
多场景加载、异步切换场景时很容易残留多余的EventSystem实例,多个EventSystem会同时检测输入并触发回调。检查当前场景的Hierarchy面板,确保全局仅存在一个EventSystem对象,多余的直接删除即可,也可以给EventSystem添加单例逻辑,加载新场景时自动销毁重复实例。 - 点击判定阈值过于灵敏
选中场景中的EventSystem对象,修改其挂载的Input System UI Input Module组件参数:适当调大Click Duration(点击有效时长阈值)和Movement Threshold(点击允许的移动偏移阈值),避免快速切换点击多个按钮时,系统将一次操作误识别为两次点击。
临时防抖兼容方案
如果排查完上述问题仍偶发触发两次的情况,可以直接在代码中加入点击冷却逻辑,过滤短时间内的重复触发,修改后的参考代码如下:
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; public class ClickableButtons : MonoBehaviour, IPointerClickHandler { // 点击冷却时间,200ms以内的重复触发会被直接过滤 private const float CLICK_COOLDOWN = 0.2f; private float _lastClickTimestamp = 0f; public void OnPointerClick (PointerEventData eventData) { if (Time.unscaledTime - _lastClickTimestamp < CLICK_COOLDOWN) { return; } _lastClickTimestamp = Time.unscaledTime; // 此处写你的正常点击逻辑 Debug.Log("Clicked"); } }
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

