You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 08:06:06