使用编辑器批量修改UGUI射线

发表于2017-09-30
评论0 1.1k浏览

如果项目UI管理不好,前期会出现很多不需要点击事件,但又打开着UI的Raycast Target属性,这个是很耗性能的。

然而 项目进行到一定时间再去管理UI射线,显然是很麻烦耗时的。

今天给大家通过Unity编辑器 来实现批量修改UI射线属性的工具。

工具图:

 

使用方法:

一、将下面脚本Copy到项目里,然后点击“Tools/检查UGUI射线”按钮

二、在“Hierarchy”或“Project”面板选择想要修改射线的预设体(可以多选)

三、点击“检查选中UI”按钮,然后所有带射线的UI都会显示在下面

四、可以点击每个UI前方的单选框按钮来设置UI射线状态、也可以点击“移除全部射线”按钮来移除当前显示的所有射线

五、改后可以查看之前选择的预设体,看看是不是改好了呢~~

上脚本:

using UnityEngine;
using System.Collections;
using UnityEditor;
using UnityEngine.UI;
using System.Collections.Generic;
public class CheckRaycastUtil : EditorWindow {
    private List<Image> imageList;
    private List<RawImage> rawimageList;
    private List<Text> textList;
    private bool includeInactive = true;
    private Transform[] selectTrans;
    private Vector2 scrollPosition;
    static CheckRaycastUtil window;
    [MenuItem("Tools/检查UGUI射线")]
    static void ModifyAtlas()
    {
        window = (CheckRaycastUtil)EditorWindow.GetWindow(typeof(CheckRaycastUtil), false, "检查UGUI射线");
        window.Show();
    }
    private void OnEnable()
    {
        imageList = new List<Image>();
        rawimageList = new List<RawImage>();
        textList = new List<Text>();
    }
    private void OnGUI()
    {
        EditorGUILayout.Space();
        includeInactive = EditorGUILayout.Toggle("包含隐藏物体:", includeInactive);
        EditorGUILayout.Space();
        if (GUILayout.Button("检查选中UI"))
        {
            CheckSelected();
        }
        EditorGUILayout.Space();
        if (GUILayout.Button("移除全部射线"))
        {
            RemoveRaycast();
        }
        // 显示选中的(含子节点)的所有Image\RawImage\Text
        int allCount = imageList.Count   rawimageList.Count   textList.Count;
        if (allCount > 0)
        {
            int index = 0;
            scrollPosition = GUI.BeginScrollView(new Rect(0, 120, Screen.width, 500), scrollPosition, new Rect(0, 120, Screen.width, allCount * 20));
            for (int i = 0; i < imageList.Count; i  )
            {
                index  ;
                imageList[i] = EditorGUI.ObjectField(new Rect(30, 120   index * 20, Screen.width, 20), imageList[i].name, imageList[i], typeof(Image)) as Image;
                imageList[i].raycastTarget = EditorGUI.Toggle(new Rect(5, 120   index * 20, 20, 20), imageList[i].raycastTarget);
            }
            for (int i = 0; i < rawimageList.Count; i  )
            {
                index  ;
                rawimageList[i] = EditorGUI.ObjectField(new Rect(30, 120   index * 20, Screen.width, 20), rawimageList[i].name, rawimageList[i], typeof(RawImage)) as RawImage;
                rawimageList[i].raycastTarget = EditorGUI.Toggle(new Rect(5, 120   index * 20, 20, 20), rawimageList[i].raycastTarget);
            }
            for (int i = 0; i < textList.Count; i  )
            {
                index  ;
                textList[i] = EditorGUI.ObjectField(new Rect(30, 120   index * 20, Screen.width, 20), textList[i].name, textList[i], typeof(Text)) as Text;
                textList[i].raycastTarget = EditorGUI.Toggle(new Rect(5, 120   index * 20, 20, 20), textList[i].raycastTarget);
            }
            GUI.EndScrollView();
        }
    }
    /// <summary>
    /// 检查已选中的项
    /// </summary>
    void CheckSelected()
    {
        imageList = new List<Image>();
        rawimageList = new List<RawImage>();
        textList = new List<Text>();
        selectTrans = Selection.GetTransforms(SelectionMode.TopLevel);
        if (selectTrans == null)
        {
            Debug.LogError("没有选中UI。");
            return;
        }
        for (int i = 0; i < selectTrans.Length; i  )
        {
            Image[] images = selectTrans[i].GetComponentsInChildren<Image>(includeInactive);
            for (int j = 0; j < images.Length; j  )
            {
                if (images[j] != null)
                    imageList.Add(images[j]);
            }
            RawImage[] rawimages = selectTrans[i].GetComponentsInChildren<RawImage>(includeInactive);
            for (int j = 0; j < rawimages.Length; j  )
            {
                if (rawimages[j] != null)
                    rawimageList.Add(rawimages[j]);
            }
            Text[] texts = selectTrans[i].GetComponentsInChildren<Text>(includeInactive);
            for (int j = 0; j < texts.Length; j  )
            {
                if (texts[j] != null)
                    textList.Add(texts[j]);
            }
        }
    }
    /// <summary>
    /// 移除UI射线
    /// </summary>
    void RemoveRaycast()
    {
        for (int i = 0; i < imageList.Count; i  )
        {
            imageList[i].raycastTarget = false;
        }
        for (int i = 0; i < rawimageList.Count; i  )
        {
            rawimageList[i].raycastTarget = false;
        }
        for (int i = 0; i < textList.Count; i  )
        {
            textList[i].raycastTarget = false;
        }
    }
}

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引

标签: