功能目的:在含有Sprite和UGUI的场景中,通过鼠标点击,区分当前鼠标下是UGUI还是SpriteRenderer。
1、EventSystem.current.IsPointerOverGameObject(); 经过测试发现,此函数不仅会对UGUI返回true,对于带有BoxCollider2D之类的组件也会返回true。 2、RaycastHit不会对BoxCollider2D生效。 3、RaycastHit2D不会对UGUI生效。 4、在摄像机上添加Physics2DRaycaster组件,使用GetComponent().Raycast(eventData, list)。会发现该方法只会对BoxCollider2D生效,而不会对UGUI生效。 5、最终发现可以使用RaycastAll方法,得到所有接受射线照射的物体,使用遍历,判断是否有UGUI的组件,代码如下:
bool IsInputOverUGUI() { PointerEventData eventData = new PointerEventData(EventSystem.current); eventData.pressPosition = Input.mousePosition; eventData.position = Input.mousePosition; List<RaycastResult> list = new List<RaycastResult>(); EventSystem.current.RaycastAll(eventData, list);//会当前射线照射到的所有物体存放于list中 var count = list.Count; for (int i = 0; i < count; i++) { if (list[i].gameObject.GetComponent<RectTransform>() != null) { return true; } } return false; }需要响应射线,Sprite应该含有BoxCollider2D组件。UGUI勾选RaycastTarget。
如果本文有错误的地方,欢迎指出。