using System;
using System.Collections.Generic;
using System.IO;
using System.Security.Cryptography;
using System.Text;
using UnityEditor;
using UnityEngine;
namespace AssetsRepeatCheckSys
{
/// <summary>
/// AtlasInfo.asset数据结构
/// </summary>
class AtlasInfo : ScriptableObject
{
[SerializeField]
private List<string> MD5s = new List<string>();
[SerializeField]
private List<string> GUIDs = new List<string>();
private Dictionary<string, string> dic = new Dictionary<string, string>();
[NonSerialized]
private string tempOutVal;
public void PushListValue(string md5, string guid)
{
MD5s.Add(md5);
GUIDs.Add(guid);
if (dic.TryGetValue(md5, out tempOutVal))
{
Debug.LogError("Repeat assets!!! exist:" + AssetDatabase.GUIDToAssetPath(tempOutVal) + " repeat:" + AssetDatabase.GUIDToAssetPath(guid));
}
else
{
dic.Add(md5, guid);
}
}
public void GenerateDicData()
{
for (int i = 0; i < MD5s.Count; i++)
{
dic.Add(MD5s[i], GUIDs[i]);
}
}
}
/// <summary>
/// 相关接口方法
/// </summary>
class AtlasInfoAssetFactory
{
public static string _atlsPath = Application.dataPath + "/Arts/UI2/Atlas/";
public static string _assetPath = "Assets/_editorconfig/AtlasInfo.asset";
/// <summary>
/// 创建Asset文件
/// </summary>
[MenuItem("Tools/GameKits/Assets Repeat Check")]
static void AssetInstance()
{
//AtlasInfo atlasInfo = AssetDatabase.LoadAssetAtPath<AtlasInfo>(_assetPath);
AtlasInfo atlasInfo = ScriptableObject.CreateInstance<AtlasInfo>();
DirectoryInfo directoryInfo = new DirectoryInfo(_atlsPath);
DirectoryInfo[] directorys = directoryInfo.GetDirectories();
EditorUtility.DisplayProgressBar("Repeat Assets Check", "大哥喝口茶等一下啊!进度条我就暂时不处理了。", 0);
string fileName;
foreach (DirectoryInfo dir in directorys)
{
FileInfo[] fileInfos = dir.GetFiles();
foreach (FileInfo fileInfo in fileInfos)
{
fileName = dir.FullName + "/" + fileInfo.Name;
if (fileName.EndsWith(".meta"))
continue;
string md5 = AtlasSysHelper.GetMD5Hash(fileName);
string guid = AtlasSysHelper.GetGuidValue(fileName);
//Debug.Log(md5 + " " + guid);
if (string.IsNullOrEmpty(md5) || string.IsNullOrEmpty(guid))
{
Debug.LogError("File parse is error, file:" + fileName);
continue;
}
atlasInfo.PushListValue(md5, guid);
}
}
AssetDatabase.CreateAsset(atlasInfo, _assetPath);
AssetDatabase.SaveAssets();
EditorUtility.ClearProgressBar();
}
static void AssetReader()
{
AtlasInfo atlasInfo = AssetDatabase.LoadAssetAtPath<AtlasInfo>(_assetPath);
atlasInfo.GenerateDicData();
}
}
/// <summary>
/// 工具方法
/// </summary>
class AtlasSysHelper
{
/// <summary>
/// 获得文件MD5值
/// </summary>
/// <param name="filePath">文件路径名</param>
/// <returns>MD5值</returns>
public static string GetMD5Hash(string filePath)
{
if (!File.Exists(filePath))
return "";
try
{
FileStream fs = new FileStream(filePath, FileMode.Open);
MD5 md5 = new MD5CryptoServiceProvider();
byte[] bytes = md5.ComputeHash(fs);
fs.Close();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < bytes.Length; i++)
{
sb.Append(bytes[i].ToString("x2"));
}
return sb.ToString();
}
catch (Exception e)
{
throw new Exception("GetMD5Hash function do fail, error:" + e.Message);
}
}
public static string GetGuidValue(string path)
{
int index = path.IndexOf("Assets");
string relativePath = path.Substring(index);
//Debug.Log(relativePath);
return AssetDatabase.AssetPathToGUID(relativePath);
}
}
}
网友评论