📜  如何修复 GetMouseButtonDown 激活 UI unity - C# (1)

📅  最后修改于: 2023-12-03 15:24:02.408000             🧑  作者: Mango

如何修复 GetMouseButtonDown 激活 UI unity - C#

在 Unity 开发中,如果你想通过鼠标点击来响应 UI 事件的话,会使用到 GetMouseButtonDown 方法。然而,有时候会发现这个方法无法激活 UI,本文将介绍如何修复这个问题。

问题描述

当我们使用以下代码时,无法激活 UI 元素的点击事件:

void Update()
{
    if (Input.GetMouseButtonDown(0))
    {
        // Handle mouse click
    }
}
解决方法
方法一:禁用选中

Unity 的 UI 系统会根据是否选中来决定是否响应点击事件。因此,我们可以将所有 UI 元素的 Selectable 组件的 Interactable 属性设为 false,这样就能够使 GetMouseButtonDown 方法激活 UI 元素的点击事件了。

方法二:使用 EventSystem

另一种修复方法是在代码中手动触发 UI 点击事件。我们可以使用 EventSystem 类来实现。以下是样例代码:

public class MouseInput : MonoBehaviour
{
    private EventSystem eventSystem;

    void Start()
    {
        eventSystem = EventSystem.current;
    }

    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            PointerEventData pointerEventData = new PointerEventData(eventSystem);
            pointerEventData.position = Input.mousePosition;
            List<RaycastResult> raycastResults = new List<RaycastResult>();
            eventSystem.RaycastAll(pointerEventData, raycastResults);
            foreach (var result in raycastResults)
            {
                ExecuteEvents.Execute(result.gameObject, pointerEventData, ExecuteEvents.pointerDownHandler);
            }
        }
    }
}

我们首先获取当前场景的 EventSystem,然后在检测到鼠标点击事件时,手动创建 PointerEventData 对象,并赋予鼠标点击位置。接下来使用 EventSystemRaycastAll 方法来获取所有被点击到的 UI 元素,并依次循环激活它们的 pointerDownHandler 事件。

总结

以上两种方法都是解决 GetMouseButtonDown 无法激活 UI 点击事件的有效方法。如果你使用了第一种方法,但是又需要启用某些 UI 元素的点击事件,可以再次将它们的 Interactable 属性设为 true。如果你使用了第二种方法,可以将 pointerDownHandler 替换为其他事件,如 pointerUpHandler 等。