小工具(一) 查找文件夹下相同的图片

       版权声明:本文为博主原创文章,博客地址:https://mp.csdn.net/postedit/84139036,未经博主允许不得转载。

在日常发开游戏中,尤其是项目初期的时候,经常会有相同的资源不同的名字出现在项目中,会对项目通用资源造成混乱,加大游戏运行时的内存消耗。

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using UnityEditor;
using System.Security.Cryptography;

public class FindAssets : EditorWindow
{
    [MenuItem("自定义工具/检查图片资源/查找重复资源")]
    public static void ShowWindow()
    {
        EditorWindow.GetWindow(typeof(FindAssets), false, "查找重复资源");
    }

    private UnityEngine.Object OnCheckFolder;                         //检测模型文件夹目录
    private List PictureObjectList = new List();
    private Vector2 m_v2ScrollPos;

    void OnGUI()
    {
        if (OnCheckFolder == null)
        {
            OnCheckFolder = AssetDatabase.LoadAssetAtPath("Assets/Game/UIs/Images");
        }
        OnCheckFolder = EditorGUILayout.ObjectField("拖入搜索目录", OnCheckFolder, typeof(UnityEngine.Object), false);

        if (GUILayout.Button("开始查找", GUILayout.Width(80)))
        {
            this.GetMD5(OnCheckFolder);
        }

        if(PictureObjectList.Count > 0 )
        {
            GUILayout.BeginHorizontal();
            EditorGUILayout.LabelField("序号", GUILayout.Width(50));
            EditorGUILayout.LabelField("重复图片1", GUILayout.Width(170));
            EditorGUILayout.LabelField("重复图片2", GUILayout.Width(170));
            GUILayout.EndHorizontal();

            m_v2ScrollPos = EditorGUILayout.BeginScrollView(m_v2ScrollPos, GUILayout.Width(500), GUILayout.Height(500));

            for (var nIdx = 0; nIdx < PictureObjectList.Count/2 ; nIdx = nIdx+2)
            {
                var obj1 = PictureObjectList[nIdx];
                var obj2 = PictureObjectList[nIdx+1];


                GUILayout.BeginHorizontal();
                EditorGUILayout.LabelField((nIdx/2 + 1).ToString(), GUILayout.Width(50));
                EditorGUILayout.ObjectField(obj1, typeof(GameObject), false, GUILayout.Width(170));
                EditorGUILayout.ObjectField(obj2, typeof(GameObject), false, GUILayout.Width(170));
                GUILayout.EndHorizontal();
            }

            EditorGUILayout.EndScrollView();
        }

    }

    private void GetMD5(Object OnCheckFolder)
    {
        if (!OnCheckFolder)
        {
            Debug.LogError("文件夹获取错误,请检查!");
            return;
        }
        PictureObjectList.Clear();

        string StrCheckFolderPath = AssetDatabase.GetAssetPath(OnCheckFolder);
        string[] assetsPath = Directory.GetFiles(StrCheckFolderPath, "*.*", SearchOption.AllDirectories);
      
        Dictionary MD5Dic = new Dictionary();
        string filemd5 = null;
        for (int i = 0; i < assetsPath.Length; i++)
        {
            //过滤meta和prefab文件
            if (!assetsPath[i].EndsWith(".meta") && !assetsPath[i].EndsWith(".prefab"))
            {
                //计算资源的md5         
                System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create();

                byte[] md5bytes = md5.ComputeHash(getTextureByte(assetsPath[i]));
                filemd5 = System.BitConverter.ToString(md5bytes).Replace("-", "");

                //存入字典,检验重复资源
                if (MD5Dic.ContainsKey(filemd5))
                {
                    //Debug.LogError("资源 重复:MD5:" + filemd5 + ",\n path:" + assetsPath[i] + "\n path:" + MD5Dic[filemd5]);

                    Object PictureObject1 = AssetDatabase.LoadAssetAtPath(assetsPath[i]);
                    Object PictureObject2 = AssetDatabase.LoadAssetAtPath(MD5Dic[filemd5]);

                    PictureObjectList.Add(PictureObject1);
                    PictureObjectList.Add(PictureObject2);

                }
                else
                {
                    MD5Dic.Add(filemd5, assetsPath[i]);
                }
            }
        }
    }

    /// 
    /// 根据图片路径返回字节流
    /// 
    /// 
    /// 
    static byte[] getTextureByte(string assetsPath)
    {
        FileStream file = new FileStream(assetsPath, FileMode.Open);
        byte[] txByte = new byte[file.Length];
        file.Read(txByte, 0, txByte.Length);
        file.Close();
        return txByte;
    }
}

小工具(一) 查找文件夹下相同的图片_第1张图片

这样我一下子就找到项目中重复的资源。

 

你可能感兴趣的:(Unity,Unity)