项目需求上要求用射线法来控制所有场景内的物体控制,写好以后用以前项目经验来屏蔽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。