我的项目出了问题。我想知道鼠标是在GUI或任何游戏对象上发生的。 我试过这个,但它显示空引用异常
EventSystem eventSystem = EventSystem.current;
if (eventSystem.IsPointerOverGameObject())
Debug.Log("left click over a gui element");
如何检测?有没有可用的活动?
答案 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;
}
答案 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所示。这段视频救了我:)。
使用EventSystem.current.IsPointerOverGameObject
将OnMouseXXX和Raycast转换为EventSystem触发器。在相机上使用物理raycaster
从EventSystems命名空间实现各种处理程序接口。在相机上使用物理raycaster。