射线检测UI时踩的一个坑

    技术2022-07-10  134

    项目需求上要求用射线法来控制所有场景内的物体控制,写好以后用以前项目经验来屏蔽UI时,具体代码网上到处都有,如下:

    public static bool IsPointerOverUIObject(Vector2 screenPosition) { PointerEventData eventDataCurrentPosition = new PointerEventData(EventSystem.current); eventDataCurrentPosition.position = new Vector2(screenPosition.x, screenPosition.y); List<RaycastResult> results = new List<RaycastResult>(); EventSystem.current.RaycastAll(eventDataCurrentPosition, results); return results.Count > 0; }

    但是在目前这个项目时,该段代码会将场景内的含有Collider的所有建筑视为UI,返回结果为True。

    输出代码内的results发现,会将Camera上用来限制边界的Bounds也视为UI。

    再进一步排查,发现是Camera上的Physics2D Raycaster组件的问题。之前为了在移动镜头时屏蔽建筑的射线操作,加入了该组件并将该组件的Event Mask选为了对应的“buildings”(自定义layer),所以在射线检测时,上面这段代码会默认Physics2D Raycaster阻挡了射线。

    将该组件关闭移除后,问题解决,不会再将建筑视为UI。

    Processed: 0.009, SQL: 9