【问题标题】:Unity3D: Detect if mouse has clicked on a UI element?Unity3D:检测鼠标是否单击了 UI 元素?
【发布时间】:2020-10-09 20:32:30
【问题描述】:

这是一个非常简单的问题,但在最新版本中 Unity 似乎发生了一些变化,我在互联网上找到的答案不再有效,所以这里什么都没有:

我得到了一些 UI 元素和一个“InputController”类,用于处理游戏期间的用户输入(控制器上的输入通过 onclick 事件处理)。

我正在寻找一种能够知道鼠标是否正在单击 UI 元素以阻止执行我的输入处理的方法(并避免用户在游戏执行“左”时单击“暂停”点击按钮。”

现在,我喜欢的大多数解决方案都有些混乱或使用了 EventSystem.current.IsPointerOverGameObject()(如this one,在编写此问题时显示),而在 2019.4 中不再出现。那么,有什么新方法可以做到这一点,我是否必须制定一些 hacky 解决方案才能从 UI 接收事件,然后阻止我的代码执行,或者我在这里遗漏了什么?

【问题讨论】:

    标签: c# unity3d user-interface


    【解决方案1】:

    您应该研究 IPointerEnterHandler 和 IPointerExitHandler 之类的接口。如果您为 UI 元素实现这些接口,则可以将必要的代码添加到这些接口所需的 OnPointerEnter 和 OnPointerExit 方法中。

    它应该像在 InputController 中添加一个 bool 一样简单,例如 isInputEnabled,并且只在为真时处理输入。将其设置为 false OnPointerEnter 和 true OnPointerExit。

    【讨论】:

    • 嘿,很抱歉回复晚了,但是生活(和项目中的其他问题)阻碍了。像魅力一样工作,它足够干净,让我可以让所有 UI 类都继承它并统一行为。谢谢!
    • 不用担心。祝你好运!
    • 如果您的 UI“元素”有多个子元素并且您想知道点击了哪个子元素,您将如何处理?比如目录名和旁边的展开图标? (没有为每个项目创建附加单一行为——我们试图将我们的代码合并到顶级对象)
    • Patrick Q,根据您的实施细节,您的问题可能有很多答案,所以我只能给您一个一般性的答案。您的顶级对象应该可以访问它们的子对象。当顶级对象处理用户交互时,您可以遍历子对象并查看它们的相关属性(即位置)以确定它们是否是用户交互的目标。当然有更好、更抽象的解决方案,但这取决于您的具体实现。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-07
    • 1970-01-01
    • 2020-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多