UGUI默认会打开一些组件的RaycastTarget属性。事实上,绝大部分的UI组件,是不需要响应Raycast的。出于性能优化考虑,这些不需要响应Raycast的UI组件,应该去掉其Raycast Target选项的勾选。
我这里写了个检查UI组件Raycast Target属性的工具,在脚本放在Project下任意的Editor目录下即可。
using UnityEditor;
using UnityEngine.UI;
using UnityEngine;public class RaycastTargetChecker : EditorWindow
{
private MaskableGraphic[] graphics;private bool hideUnchecked = false;private bool showBorders = true;private Color borderColor = Color.blue;private Vector2 scrollPosition = Vector2.zero;private static RaycastTargetChecker instance = null;[MenuItem ("Tools/RaycastTarget Checker")]private static void Open (){
instance = instance ?? EditorWindow.GetWindow<RaycastTargetChecker> ("RaycastTargets");instance.Show ();}void OnEnable (){
instance = this;}void OnDisable (){
instance = null;}void OnGUI (){
using (EditorGUILayout.HorizontalScope horizontalScope = new EditorGUILayout.HorizontalScope ()) {
showBorders = EditorGUILayout.Toggle ("Show Gizmos", showBorders, GUILayout.Width (200.0f));borderColor = EditorGUILayout.ColorField (borderColor);}hideUnchecked = EditorGUILayout.Toggle ("Hide Unchecked", hideUnchecked);GUILayout.Space (12.0f);Rect rect = GUILayoutUtility.GetLastRect ();GUI.color = new Color (0.0f, 0.0f, 0.0f, 0.25f);GUI.DrawTexture (new Rect (0.0f, rect.yMin + 6.0f, Screen.width, 4.0f), EditorGUIUtility.whiteTexture);GUI.DrawTexture (new Rect (0.0f, rect.yMin + 6.0f, Screen.width, 1.0f), EditorGUIUtility.whiteTexture);GUI.DrawTexture (new Rect (0.0f, rect.yMin + 9.0f, Screen.width, 1.0f), EditorGUIUtility.whiteTexture);GUI.color = Color.white;graphics = GameObject.FindObjectsOfType<MaskableGraphic> ();using (GUILayout.ScrollViewScope scrollViewScope = new GUILayout.ScrollViewScope (scrollPosition)) {
scrollPosition = scrollViewScope.scrollPosition;for (int i = 0; i < graphics.Length; i++) {
MaskableGraphic graphic = graphics [i];if (hideUnchecked == false || graphic.raycastTarget == true) {
DrawElement (graphic);} }}foreach (var item in graphics) {
EditorUtility.SetDirty (item);}Repaint ();}private void DrawElement (MaskableGraphic graphic){
using (EditorGUILayout.HorizontalScope horizontalScope = new EditorGUILayout.HorizontalScope ()) {
Undo.RecordObject (graphic, "Modify RaycastTarget");graphic.raycastTarget = EditorGUILayout.Toggle (graphic.raycastTarget, GUILayout.Width (20));EditorGUI.BeginDisabledGroup (true);EditorGUILayout.ObjectField (graphic, typeof(MaskableGraphic), true);EditorGUI.EndDisabledGroup ();}}[DrawGizmo (GizmoType.Selected | GizmoType.NonSelected)]private static void DrawGizmos (MaskableGraphic source, GizmoType gizmoType){
if (instance != null && instance.showBorders == true && source.raycastTarget == true) {
Vector3[] corners = new Vector3[4];source.rectTransform.GetWorldCorners (corners);Gizmos.color = instance.borderColor;for (int i = 0; i < 4; i++) {
Gizmos.DrawLine (corners [i], corners [(i + 1) % 4]);}if (Selection.activeGameObject == source.gameObject) {
Gizmos.DrawLine (corners [0], corners [2]);Gizmos.DrawLine (corners [1], corners [3]);}}SceneView.RepaintAll ();}
}
使用方法很简单,打开Tools->RaycastTarget Checker,弹出主窗口,窗口下会显示场景下所有包含Raycast Target属性的组件。可以根据需要显示或隐藏Scene视图下的边框,以及设置边框颜色;也可以根据需要隐藏已经被取消勾选的UI组件。
效果图如下: