替換所有材質球


using UnityEngine;
using UnityEditor;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.IO;
using LitJson;

public class effectdata {
    public int id;
    public string oldname;
    public string newname;
}

public class EffChangeManager : EditorWindow 
{
    private List<effectdata> effectdata;

    string matName = "";
    int needChange = 0;

    /// <summary>
    /// 特效搜索路徑
    /// </summary>
    private string effectPath = "Assets/Resource";
    private string effectPath1 = "Assets/Resource/ui";
    private string effectPath2 = "Assets/Resource/fx";
    private string dataPath = "Editor/fxchange/effectdata.json";
    private string tempdataPath = "";
    private List<string> notPaths = new List<string>();

    //-----------------------------------------------------

    [MenuItem("HZTools/特效材替換")]
	static void AddArtGongJu01()
	{
        GetWindow<EffChangeManager>("特效材質查看器");
	}

    void OnGUI()
    {
        dataPath = EditorGUILayout.TextField("數據目錄:", dataPath);
        effectPath = EditorGUILayout.TextField("特效搜索目錄:", effectPath);

        if (GUILayout.Button("檢查表中要替換的材質是否存在"))
        {

            tempdataPath = Application.dataPath + "/"+ dataPath;
            StreamReader streamreader = new StreamReader(tempdataPath);//讀取數據,轉換成數據流
            JsonReader js = new JsonReader(streamreader);//再轉換成json數據
            effectdata = JsonMapper.ToObject<List<effectdata>>(js);//讀取

            bool canChange = true;
            ShowProgress(0, 0, 0);
            int m_jishu = 0;
            for (int m = 0; m < effectdata.Count; m++)
            {
                effectdata tempData = effectdata[m];
                if (tempData != null)
                {
                    if (GetFxByName(tempData.newname) == null)
                    {
                        canChange = false;
                        Debug.LogError(tempData.newname + "未找到");
                    }
                }

                ShowProgress((float)m_jishu / (float)effectdata.Count, effectdata.Count, m_jishu);
                m_jishu++;
            }
            EditorUtility.ClearProgressBar();
            if (canChange)
            {
                Debug.Log("檢測成功!可以替換");
            }
            else {
                Debug.Log("檢測失敗!");
            }
        }

        if (GUILayout.Button("開始替換材質"))
        {

            tempdataPath = Application.dataPath + "/" + dataPath;
            StreamReader streamreader = new StreamReader(tempdataPath);//讀取數據,轉換成數據流
            JsonReader js = new JsonReader(streamreader);//再轉換成json數據
            effectdata = JsonMapper.ToObject<List<effectdata>>(js);//讀取

            LookupTargetMatUsed();
        }

        if (GUILayout.Button("檢查沒有引用的材質球"))
        {
            tempdataPath = Application.dataPath + "/" + dataPath;
            StreamReader streamreader = new StreamReader(tempdataPath);//讀取數據,轉換成數據流
            JsonReader js = new JsonReader(streamreader);//再轉換成json數據
            effectdata = JsonMapper.ToObject<List<effectdata>>(js);//讀取

            notPaths.Clear();

            ShowProgress(0, 0, 0);
            int m_jishu = 0;
            for (int m = 0; m < effectdata.Count; m++)
            {
                effectdata tempData = effectdata[m];
                if (tempData != null)
                {
                    DelectNotUse(tempData.oldname);
                }
                ShowProgress((float)m_jishu / (float)effectdata.Count, effectdata.Count, m_jishu);
                m_jishu++;
            }
            EditorUtility.ClearProgressBar();
        }

        if (GUILayout.Button("刪除全部沒有引用的材質球"))
        {
            foreach (var item in notPaths)
            {
                Debug.Log("成功刪除無用資源" + item);
                File.Delete(item);
            }
            Debug.Log("成功刪除" + notPaths.Count + "個材質資源");
        }

        if (GUILayout.Button("test"))
        {
            tempdataPath = Application.dataPath + "/" + dataPath;
            StreamReader streamreader = new StreamReader(tempdataPath);//讀取數據,轉換成數據流
            JsonReader js = new JsonReader(streamreader);//再轉換成json數據
            effectdata = JsonMapper.ToObject<List<effectdata>>(js);//讀取

            // LookupTargetMatUsed2();

            //for (int m = 0; m < effectdata.Count; m++)
            //{
            //    effectdata tempData = effectdata[m];
            //    if (tempData.newname == tempData.oldname) {
            //        Debug.Log(tempData.oldname);
            //    }
            //}

            ChangeShader();

        }

    }

    private Material GetFxByName(string matName) {
        string[] newNames = AssetDatabase.FindAssets(matName);
        foreach (var item in newNames)
        {
            var assetPath2 = AssetDatabase.GUIDToAssetPath(item);
            var asset2 = AssetDatabase.LoadMainAssetAtPath(assetPath2);
            var assetObj2 = asset2 as Material;
            //var assetObj2 = PrefabUtility.InstantiatePrefab(asset2) as Material;

            if (assetObj2 != null)
            {
                return assetObj2;
            }
        }
        return null;
    }


    private void DelectNotUse(string notUserMat)
    {
        var allGuids = AssetDatabase.FindAssets("t:GameObject", new string[] { effectPath });
        if (allGuids.Length > 0)
        {
            int i = 0;
            //ShowProgress(0, 0, 0);
            //int m_jishu = 0;
            foreach (var guid in allGuids)
            {
                var assetPath = AssetDatabase.GUIDToAssetPath(guid);
                var asset = AssetDatabase.LoadMainAssetAtPath(assetPath);
                var assetObj = asset as GameObject;

                var rends = assetObj.GetComponentsInChildren<Renderer>();
                if (rends.Length > 0)
                {
                    foreach (var rend in rends)
                    {
                        var mats = rend.sharedMaterials;
                        if (mats.Length > 0)
                        {
                            for (int j = 0; j < mats.Length; j++)
                            {
                                if (mats[j] != null)
                                {
                                    Material temp = mats[j];
                                    if (temp.name == notUserMat)
                                    {
                                        i = i + 1;
                                    }
                                }
                            }
                        }
                    }
                }

                //ShowProgress((float)m_jishu / (float)allGuids.Length, allGuids.Length, m_jishu);
                //m_jishu++;
            }
            //EditorUtility.ClearProgressBar();
            if (i == 0)
            {
                Debug.LogWarning(notUserMat);

                string[] newNames = AssetDatabase.FindAssets(notUserMat);
                foreach (var item in newNames)
                {
                    var assetPath3 = AssetDatabase.GUIDToAssetPath(item);
                    var asset3 = AssetDatabase.LoadMainAssetAtPath(assetPath3);
                    var assetObj3 = asset3 as Material;

                    if (assetObj3 != null)
                    {
                        Debug.Log("無用資源路徑" + assetPath3+"  "+ assetObj3.name);
                        notPaths.Add(assetPath3);
                        break;
                    }
                }
            }
           
        }
    }


    private void LookupTargetMatUsed2()
    {
        needChange = 0;
        var allGuids = AssetDatabase.FindAssets("uirecharge");
        if (allGuids.Length > 0)
        {
            int i = 0;
            ShowProgress(0, 0, 0);
            int m_jishu = 0;
            foreach (var guid in allGuids)
            {
                var assetPath = AssetDatabase.GUIDToAssetPath(guid);
                var asset = AssetDatabase.LoadMainAssetAtPath(assetPath);
                var assetObj = PrefabUtility.InstantiatePrefab(asset) as GameObject;

                Debug.LogWarning(assetPath);

                if (assetObj == null) {
                    Debug.LogError(assetPath);
                    continue;
                }

                bool isNeed = false;
                if (matName != assetObj.name)
                {
                    matName = assetObj.name;
                    Debug.LogWarning(matName);
                }

                var rends = assetObj.GetComponentsInChildren<ParticleSystemRenderer>(true);

                if (rends.Length > 0)
                {
                    foreach (var rend in rends)
                    {
                        var mats = rend.sharedMaterials;
                        var trailMat = rend.trailMaterial;
                        ChangeTrailMat(trailMat);
                        if (mats.Length > 0)
                        {
                            for (int j = 0; j < mats.Length; j++)
                            {
                                if (mats[j] != null)
                                {
                                    Material temp = mats[j];
                                    for (int m = 0; m < effectdata.Count; m++)
                                    {
                                        effectdata tempData = effectdata[m];
                                        if (tempData != null)
                                        {
                                            if (temp.name == tempData.oldname)
                                            {
                                                Debug.Log(string.Format("當前材質{0},舊的材質名{1},新替換的材質名{2},randname{3}", temp.name, tempData.oldname, tempData.newname, rend.name));

                                                ShowProgress((float)m_jishu / (float)allGuids.Length, allGuids.Length, m_jishu);
                                                m_jishu++;

                                                var assetObj2 = GetFxByName(tempData.newname);

                                                if (assetObj2 != null)
                                                {
                                                    mats[j] = assetObj2;
                                                    isNeed = true;
                                                    if (mats[j].name == tempData.newname)
                                                    {
                                                        Debug.Log(string.Format("{0}成功替換{1}", matName, tempData.newname));
                                                    }
                                                    else {
                                                        Debug.LogError(string.Format("{0}替換失敗{1}", matName, tempData.newname));
                                                    }
                                                }
                                                else
                                                {
                                                    Debug.LogError("未找到   " + tempData.newname);
                                                }

                                                i = i + 1;
                                            }
                                        }
                                    }
                                }
                            }
                            if (isNeed)
                            {
                                rend.materials = mats;
                            }
                        }


                    }
                }

                if (!isNeed)
                {
                    Debug.Log(string.Format("{0}不需要替換材質", matName));
                }
                else
                {
                    try
                    {
                        PrefabUtility.ReplacePrefab(assetObj, asset);
                    }
                    catch (System.Exception ex)
                    {
                        Debug.LogWarning(ex.ToString() + assetObj.name);
                    }
                    AssetDatabase.SaveAssets();
                    needChange++;
                }
                GameObject.DestroyImmediate(assetObj);


            }
            EditorUtility.ClearProgressBar();
            if (i == 0)
            {
                Debug.LogWarning(">>>>>>>>>>>>>>>!目標材質沒有被使用!<<<<<<<<<<<<<<<<<<<<<<<<<<");
            }
            if (i > 0)
            {
                Debug.LogWarning("替換" + needChange + "個特效!!!");
            }
        }
    }



    private void LookupTargetMatUsed()
    {
        needChange = 0;
        var allGuids = AssetDatabase.FindAssets("t:GameObject", new string[] { effectPath });
        if (allGuids.Length > 0)
        {
            int i = 0;
            ShowProgress(0, 0, 0);
            int m_jishu = 0;
            foreach (var guid in allGuids)
            {
                //if (m_jishu >= 20) {
                //    break;
                //}

                var assetPath = AssetDatabase.GUIDToAssetPath(guid);
                var asset = AssetDatabase.LoadMainAssetAtPath(assetPath);
                var assetObj = PrefabUtility.InstantiatePrefab(asset) as GameObject;

                bool isNeed = false;
                if (matName != assetObj.name) {
                    matName = assetObj.name;
                    Debug.LogWarning(matName);
                }

                var rends = assetObj.GetComponentsInChildren<ParticleSystemRenderer>(true);
                if (rends.Length > 0)
                {
                    foreach (var rend in rends)
                    {
                        var mats = rend.sharedMaterials;
                        var trailMat = rend.trailMaterial;
                        ChangeTrailMat(trailMat);
                        if (mats.Length > 0)
                        {
                            for (int j = 0; j < mats.Length; j++)
                            {
                                if (mats[j] != null) { 
                                    Material temp = mats[j];
                                    for (int m = 0; m < effectdata.Count; m++)
                                    {
                                        effectdata tempData = effectdata[m];
                                        if (tempData != null)
                                        {
                                            if (temp.name == tempData.oldname)
                                            {
                                                Debug.Log(string.Format("當前材質{0},舊的材質名{1},新替換的材質名{2}", temp.name, tempData.oldname, tempData.newname));

                                                var assetObj2 = GetFxByName(tempData.newname);


                                                if (assetObj2 != null)
                                                {
                                                    mats[j] = assetObj2;
                                                    isNeed = true;
                                                    if (mats[j].name == tempData.newname)
                                                    {
                                                        Debug.Log(string.Format("{0}成功替換{1}", matName, tempData.newname));
                                                    }
                                                    else
                                                    {
                                                        Debug.LogError(string.Format("{0}替換失敗{1}", matName, tempData.newname));
                                                    }
                                                }
                                                else
                                                {
                                                    Debug.LogError("未找到   " + tempData.newname);
                                                }

                                                i = i + 1;
                                            }
                                        }
                                    }
                                }
                            }
                            if (isNeed)
                            {
                                rend.materials = mats;
                            }
                        }
                    }
                }

                if (!isNeed)
                {
                    Debug.Log(string.Format("{0}不需要替換材質", matName));
                }
                else {
                    try
                    {
                        PrefabUtility.ReplacePrefab(assetObj, asset);
                    }
                    catch (System.Exception ex)
                    {
                        Debug.LogWarning(ex.ToString() + assetObj.name);
                    }
                    AssetDatabase.SaveAssets();
                    needChange++;
                }
                GameObject.DestroyImmediate(assetObj);

                ShowProgress((float)m_jishu / (float)allGuids.Length, allGuids.Length, m_jishu);
                m_jishu++;
            }
            EditorUtility.ClearProgressBar();
            if (i == 0)
            {
                Debug.LogWarning(">>>>>>>>>>>>>>>!目標材質沒有被使用!<<<<<<<<<<<<<<<<<<<<<<<<<<");
            }
            if (i > 0)
            {
                Debug.LogWarning("替換" + needChange+"個特效!!!");
            }
            AssetDatabase.Refresh();
        }
    }

    public void ChangeTrailMat(Material mat) {
        if (mat == null) {
            return;
        }
        for (int m = 0; m < effectdata.Count; m++)
        {
            effectdata tempData = effectdata[m];
            if (tempData != null)
            {
                if (mat.name == tempData.oldname)
                {
                    Debug.Log(string.Format("當前材質{0},舊的材質名{1},新替換的材質名{2}", mat.name, tempData.oldname, tempData.newname));

                    var assetObj2 = GetFxByName(tempData.newname);

                    if (assetObj2 != null)
                    {
                        mat = assetObj2;
                        if (mat.name == tempData.newname)
                        {
                            Debug.Log(string.Format("{0}成功替換{1}", matName, tempData.newname));
                        }
                        else
                        {
                            Debug.Log(string.Format("{0}替換失敗{1}", matName, tempData.newname));
                        }
                    }
                    else
                    {
                        Debug.LogError("未找到   " + tempData.newname);
                    }
                }
            }
        }
    }


    /// <summary>
    /// 開啓進度條窗口
    /// </summary>
    /// <param name="val">Value.</param>
    /// <param name="total">Total.</param>
    /// <param name="cur">Current.</param>
    public static void ShowProgress(float val, int total, int cur)
	{
		EditorUtility.DisplayProgressBar("查找中!", string.Format("查找 ({0}/{1}), 請稍等...", cur, total), val);
	}


    public void ChangeShader()
    {
        // var allGuids = AssetDatabase.FindAssets("db-lh-xyh-m");
        int matNum = 0;
        var allGuids = AssetDatabase.FindAssets("t:Material", new string[] { "Assets/Resource/ui/db-ani" });
        if (allGuids.Length > 0)
        {
            foreach (var guid in allGuids)
            {
                var assetPath = AssetDatabase.GUIDToAssetPath(guid);
                var asset = AssetDatabase.LoadMainAssetAtPath(assetPath);
                var assetObj = asset as Material;



                if (assetObj == null)
                {
                    //Debug.LogError(assetPath);
                    continue;
                }

                if (matName != assetObj.name)
                {
                    matName = assetObj.name;
                    Debug.LogWarning(matName);
                }

                //Debug.Log(assetObj.shader.name);
                if (assetObj.shader.name == "DragonBones/BlendModes/Old")
                {
                    Debug.LogWarning(assetPath);
                    matNum++;
                    assetObj.shader = Shader.Find("Sprites/Default");
                }

            }

        }
        Debug.Log("替換了  "+ matNum);
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章