You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Unity中点击UI Toolkit按钮时,如何阻止InputActions的左键点击执行?

解决Unity Input System与UI Toolkit按钮点击冲突的问题

方法1:在UI按钮事件中拦截输入传播

当UI Toolkit按钮被点击时,直接在回调里标记事件已处理,阻止其传递给Input System。需要注册带ClickEvent参数的回调:

using UnityEngine.UIElements;

public class WindowController : MonoBehaviour
{
    private VisualElement rootElement;
    private Button closeBtn;

    void Awake()
    {
        rootElement = GetComponent<UIDocument>().rootVisualElement;
        closeBtn = rootElement.Q<Button>("CloseButton");
        closeBtn.RegisterCallback<ClickEvent>(OnCloseBtnClicked);
    }

    private void OnCloseBtnClicked(ClickEvent evt)
    {
        // 隐藏窗口
        rootElement.style.display = DisplayStyle.None;
        
        // 阻止事件继续传播,避免Input System响应此次点击
        evt.StopPropagation();
        evt.PreventDefault();
    }
}

方法2:在Input Action回调中判断是否点击UI

在Input System绑定的左键处理方法里,先检查点击是否落在UI元素上,若是则跳过核心逻辑。对于UI Toolkit,用VisualElementUtility.IsElementUnderPointer()判断:

using UnityEngine.InputSystem;
using UnityEngine.UIElements;

public class InputHandler : MonoBehaviour
{
    public InputAction leftClickAction;

    void OnEnable()
    {
        leftClickAction.performed += OnLeftClick;
        leftClickAction.Enable();
    }

    void OnDisable()
    {
        leftClickAction.performed -= OnLeftClick;
        leftClickAction.Disable();
    }

    private void OnLeftClick(InputAction.CallbackContext context)
    {
        // 检查鼠标是否在UI Toolkit元素上
        if (VisualElementUtility.IsElementUnderPointer())
        {
            return;
        }

        // 你的左键点击核心逻辑
        Debug.Log("执行左键交互逻辑");
    }
}

如果项目同时使用UGUI,可以补充EventSystem.current.IsPointerOverGameObject()来兼容两种UI系统。

方法3:窗口显隐时切换Input Action状态

直接在窗口显示时禁用左键绑定的Input Action,隐藏时重新启用,适合窗口完全遮挡背后交互的场景:

using UnityEngine.InputSystem;
using UnityEngine.UIElements;

public class WindowController : MonoBehaviour
{
    private VisualElement rootElement;
    private Button closeBtn;
    public InputAction leftClickAction;

    void Awake()
    {
        rootElement = GetComponent<UIDocument>().rootVisualElement;
        closeBtn = rootElement.Q<Button>("CloseButton");
        closeBtn.clicked += HideWindow;
    }

    public void ShowWindow()
    {
        rootElement.style.display = DisplayStyle.Flex;
        leftClickAction.Disable();
    }

    private void HideWindow()
    {
        rootElement.style.display = DisplayStyle.None;
        leftClickAction.Enable();
    }
}

内容的提问来源于stack exchange,提问作者user975561

火山引擎 最新活动