在制作游戏时,有时需要发射射线执行游戏的相关功能,但是在点击UI的同时,却也会触发游戏内的相关功能,为了规避此事件的发生,Unity提供了一个名为EventSystem.current.IsPointerOverGameObject()的函数,使用这个函数可以规避点在UI上依旧会触发游戏功能。但是在电脑上运行无误,打包成apk到真机上之后,这个函数会失效。
所以我们用如下代码对此接口进行优化,示例代码如下:
public static bool IsPointerOverGameObject()
{
PointerEventData eventData = new PointerEventData(UnityEngine.EventSystems.EventSystem.current);
eventData.pressPosition = Input.mousePosition;
eventData.position = Input.mousePosition;
List<RaycastResult> list = new List<RaycastResult>();
UnityEngine.EventSystems.EventSystem.current.RaycastAll(eventData, list);
return list.Count > 0;
}
调用优化后的接口即可
if (IsPointerOverGameObject() == false)
此接口多数情况下工作正常,但是有一种情况会失效。当点击关闭按钮关闭某个界面或UI时。还是会出现点到UI,界面顺利关闭的情况下触发游戏功能。解决方法只能延缓界面的关闭。示例代码如下:
public void CloseChangeWindow()
{
Invoke("RealClose",0.1f);
}
private void RealClose()
{
ChangeWindow.SetActive(false);
}
如有更好的解决方法欢迎留言探讨。
|