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




