版权声明:本文为博主原创文章,博客地址: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<Object> PictureObjectList = new List<Object>();
private Vector2 m_v2ScrollPos;
void OnGUI()
{
if (OnCheckFolder == null)
{
OnCheckFolder = AssetDatabase.LoadAssetAtPath<UnityEngine.Object>("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<string, string> MD5Dic = new Dictionary<string, string>();
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<UnityEngine.Object>(assetsPath[i]);
Object PictureObject2 = AssetDatabase.LoadAssetAtPath<UnityEngine.Object>(MD5Dic[filemd5]);
PictureObjectList.Add(PictureObject1);
PictureObjectList.Add(PictureObject2);
}
else
{
MD5Dic.Add(filemd5, assetsPath[i]);
}
}
}
}
/// <summary>
/// 根据图片路径返回字节流
/// </summary>
/// <param name="texturePath"></param>
/// <returns></returns>
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;
}
}
这样我一下子就找到项目中重复的资源。