查找任意shader的Material引用,并在界面上显示出来,且可以快速定位

1首先要遍历所有的资源

过滤出.mat的资源,也就是Material,然后通过Shader名来查找对应的引用的材质,然后可以将这些路径名打出来。

改进

打印出所有的路径名还要自己去找不是很方便,后面将它输出到面板上,并且可以快速定位,用到了编辑器开发,editorlayout,

ObjectField

核心逻辑
EditorGUILayout.ObjectField("", go, typeof(Material), false);                    

最后因为路径太长需要修改左侧的长度,后面引入了GUIContent作为第一个参数,然后以为需要长度长一点,
引入逻辑EditorGUIUtility.labelWidth = 400,设置他的长度。

最后上代码

using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Text;
using UnityEditor;
using UnityEngine;
using System.Threading;
 
public class SearchShader :EditorWindow
{
 
    // public static string FilePath = "Assets/Materials";
    public static string FilePath = "Assets";
    //搜索固定文件夹中的所有Material的路径
    public static List<string> listMatrials;
    public static List<string> listTargetMaterial;
 
    public static string selectedShaderName;
 
    public static StringBuilder sb;
    static public SearchShader instance;
    public Dictionary<string, BetterList<string>> dict;
    public BetterList<string> allPath;
    Vector2 mScroll = Vector2.zero;
    
    void OnEnable()
    {
        // instance = this;
    }

    void OnDisable()
    {
        // instance = null;
    }

    void OnGUI()
    {
        if (listTargetMaterial == null)
        {
            return;
        }

        mScroll = GUILayout.BeginScrollView(mScroll);

        List<string> list = listTargetMaterial;
        if (list != null && list.Count > 0)
        {
            if (NGUIEditorTools.DrawHeader("Mat"))
            {
                int count = 0;
                foreach (string item in list)
                {
                    // Debug.Log("item ----------------"+item);                    
                    count += 1;
                    Material go = AssetDatabase.LoadAssetAtPath(item, typeof(Material)) as Material;                    
                    GUIContent label1 = new GUIContent(count+"---"+item,item);                                                    
                    EditorGUIUtility.labelWidth = EditorGUIUtility.currentViewWidth * 0.6f;                                               
                    EditorGUILayout.ObjectField(label1, go, typeof(Material), false);                    
                }
            }
            // Debug.Log("当前的窗体的的宽度是----------------------------------"+EditorGUIUtility.currentViewWidth);

            list = null;
        }        

        GUILayout.EndScrollView();
    }

    [MenuItem("Assets/SearchShader", true)]
    private static bool OptionSelectAvailable()
    {
        if(Selection.activeObject == null)
        {
            return false;
        }
        return Selection.activeObject.GetType() == typeof(Shader);
    }
 
    [MenuItem("Assets/SearchShader")]
    private static void SearchConstantShader()
    {
        Debug.Log("当前选中的Shader名字:" + Selection.activeObject.name);
        sb = new StringBuilder();
 
        selectedShaderName = Selection.activeObject.name;
 
        listMatrials = new List<string>();
        listMatrials.Clear();
        listTargetMaterial = new List<string>();
        listTargetMaterial.Clear();
 
        //项目路径 eg:projectPath = D:Project/Test/Assets
        string projectPath = Application.dataPath;
 
        //eg:projectPath = D:Project/Test
        projectPath = projectPath.Substring(0, projectPath.IndexOf("Assets"));
 
        try
        {
            //获取某一文件夹中的所有Matrial的Path信息
            GetMaterialsPath(projectPath, FilePath, "Material",ref listMatrials);
        }
        catch(System.Exception e)
        {
            Debug.LogError(e);
        }
 
        for (int i = 0; i < listMatrials.Count; i++)
        {
            EditorUtility.DisplayProgressBar("Check Materials", "Current Material :" 
                + i + "/" + listMatrials.Count,(float)i/ listMatrials.Count);
 
            try
            {
                //开始Check
                BegainCheckMaterials(listMatrials[i]);
            }
            catch (System.Exception e)
            {
                EditorUtility.ClearProgressBar();
                Debug.LogError(e);
            }
        }
 
        // PrintToTxt();
        //生成界面
        EditorUtility.ClearProgressBar();
        EditorWindow.GetWindow<SearchShader>(false, "SearchShader", true).Show();
        Debug.Log("Check Success");
    }
 
    //获取某一文件夹中的所有Matrial的Path信息
    public static void GetMaterialsPath(string projectPath,string targetFilePath,string searchType,ref List<string> array)
    {
        if (Directory.Exists(targetFilePath))
        {
            string[] guids;
            //搜索
            guids = AssetDatabase.FindAssets("t:" + searchType, new[] { targetFilePath });            
            foreach (string guid in guids)
            {
                string source = AssetDatabase.GUIDToAssetPath(guid);
                string[] allStr = source.Split('.');
                // if(allStr[allStr.Length-1] == "mat")
                if(source.EndsWith(".mat"))
                {
                    listMatrials.Add(source);
                    // Debug.Log("当前的material------------"+source);
                }                                
            }
            // Debug.Log("当前material的总数是---------------"+listMatrials.Count);
        }
    }
 
    //开始检查Material
    public static void BegainCheckMaterials(string materialPath)
    {
        Material mat = AssetDatabase.LoadAssetAtPath<Material>(materialPath);
        if (mat.shader.name == selectedShaderName)
        {
            listTargetMaterial.Add(materialPath);
        }
    }
 
    public static void PrintToTxt()
    {
        //加入shader的名字
        listTargetMaterial.Add(selectedShaderName);
 
        FileInfo fi = new FileInfo(Application.dataPath + "/Materials.txt");
        if (!fi.Exists)
        {
            // fi.CreateText();   
            // fi.OpenWrite();  
            // Thread.Sleep(1000);              
            var stream =  fi.Create();
            stream.Dispose();  
        }
        // else
        {
            StreamWriter sw = new StreamWriter(Application.dataPath + "/Materials.txt");
            for (int i = 0; i < listTargetMaterial.Count - 1; i++)
            {
                sb.Append(listTargetMaterial[i] + "\n");
            }
            string useNum = string.Format("共有 {0} 个Material用到:{1}", listTargetMaterial.Count - 1, selectedShaderName);
            sb.Append(useNum + "\n");
            sb.Append("用到的shader名字为:" + selectedShaderName);
            sw.Write(sb.ToString());
 
            sw.Flush();
            sw.Close();
            sw.Dispose();
        }
    }

}

ps:脚本放在Assets下面的Editor下面,没有就创建一个

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,254评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,875评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,682评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,896评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,015评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,152评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,208评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,962评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,388评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,700评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,867评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,551评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,186评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,901评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,689评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,757评论 2 351

推荐阅读更多精彩内容