【问题标题】:Detect mouse clicked on GUI检测鼠标点击 GUI
【发布时间】:2016-08-29 13:23:01
【问题描述】:

我的项目有问题。我想知道鼠标点击发生在 GUI 或任何游戏对象上。 我已经尝试过了,但它显示空引用异常

EventSystem eventSystem = EventSystem.current;
            if (eventSystem.IsPointerOverGameObject())
               Debug.Log("left click over a gui element");

如何检测??有什么活动可以参加吗?

【问题讨论】:

  • 您使用的是什么 GUI 系统 @Mohammad? Slumtrimpet 答案应该适用于 GameObjects 和 NUI,但可能不适用于旧版 OnGUI。如果您使用的是旧版 GUI,请让我们知道您是使用 GUILayout 还是仅使用 GUI 进行绘图,因为每个方法都可能会有所不同...
  • 我正在使用旧版 gui。我正在用代码制作按钮

标签: unity3d


【解决方案1】:

IsPointerOverGameObject() 在移动设备和一些极端情况下相当糟糕。我们为我们的项目推出了自己的项目,它在我们投入的所有平台上都像冠军一样工作。

private bool IsPointerOverUIObject() {
  PointerEventData eventDataCurrentPosition = new PointerEventData(EventSystem.current);
  eventDataCurrentPosition.position = new Vector2(Input.mousePosition.x, Input.mousePosition.y);
  List<RaycastResult> results = new List<RaycastResult>();
  EventSystem.current.RaycastAll(eventDataCurrentPosition, results);
  return results.Count > 0;
}

来源: http://forum.unity3d.com/threads/ispointerovereventsystemobject-always-returns-false-on-mobile.265372/

【讨论】:

  • 在 EventSystem 中显示空引用异常。我不知道为什么
【解决方案2】:

您可以使用一些方法来检测您的鼠标是否位于旧版 GUI 元素上你会发现很多不同的方法来做到这一点(这是我在遗留 GUI 项目中使用的方法,通常可以很好地使用触摸):

创建一个易于访问的行为(通常是单例)来保持 MouseOverGUI“状态”:

如果您使用的是 GUILayout.Button,您需要捕捉最后绘制的矩形,如果您是 GUI.Button,只需使用您作为按钮参数传递的相同矩形,如下所示:

// GUILayout
( Event.current.type == EventType.Repaint &&
    GUILayoutUtility.GetLastRect().Contains( Event.current.mousePosition ) ) {
        mouseOverGUI = true;
     }
} // you need call it in your OnGUI right after the call to the element that you want to control

// GUI
( Event.current.isMouse &&
    yourRect.Contains( Event.current.mousePosition ) ) {
        mouseOverGUI = true;
     }
}

之后,您只需要测试 mouseOverGUI 是 true 还是 false 以在执行之前允许或不允许您想要的单击操作。 (对统一循环有很好的理解将帮助您在正确的时间捕获和测试标志,以避免期望得到已经改变的东西的问题)

已编辑:还记得在未超过 GUI 时将 mouseOverGUI 重置为 false ;)

【讨论】:

    【解决方案3】:

    终于得到了我的答案here: 如video tutorial 所示,有三种方法可以做到这一点。这个视频救了我:)。

    1. 使用 EventSystem.current.IsPointerOverGameObject

    2. 将您的 OnMouseXXX 和 Raycast 转换为 EventSystem 触发器。在相机上使用物理光线投射器

    从 EventSystems 命名空间实现各种处理程序接口。在相机上使用物理光线投射器。

    【讨论】:

      猜你喜欢
      • 2020-04-18
      • 2023-03-12
      • 2021-09-06
      • 2015-08-03
      相关资源
      最近更新 更多