检测鼠标点击GUI

时间:2015-08-19 12:21:05

标签: unity3d

我的项目出了问题。我想知道鼠标是在GUI或任何游戏对象上发生的。 我试过这个,但它显示空引用异常

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

如何检测?有没有可用的活动?

3 个答案:

答案 0 :(得分:3)

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/

答案 1 :(得分:0)

您可以使用一些方法来检测您的鼠标是否在遗留的GUI元素上,我将向您展示一个我希望对您有用的方法,如果不研究一下“鼠标悬停在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,以便在执行之前允许或不允许你想要的点击操作。 (对Unity循环的一个很好的理解将帮助你在正确的时间内捕获和测试标志,以避免出现问题,期望得到已经改变的东西)

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

答案 2 :(得分:0)

最后得到了我的回答here: 有三种方法可以做到这一点,如video tutorial所示。这段视频救了我:)。

  1. 使用EventSystem.current.IsPointerOverGameObject

  2. 将OnMouseXXX和Raycast转换为EventSystem触发器。在相机上使用物理raycaster

  3. 从EventSystems命名空间实现各种处理程序接口。在相机上使用物理raycaster。