unity-判断当前鼠标下的物体是否有UGUI组件

    技术2023-12-04  98

    功能目的:在含有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。

    如果本文有错误的地方,欢迎指出。

    Processed: 0.009, SQL: 10