UnityEditor开发教程之检查重复Sprite

发表于2018-10-08
评论0 1k浏览
本篇文章主要给大家分享下检查Unity中重复的Sprite资源与名称重复的Sprite,其中打包图集使用unity2017中的新功能SpriteAtlas,想知道方法的可以看看。

代码如下:
   [MenuItem("Tools/Atlas/Check Atlas")]
    public static void CheckAtlas()
    {
        EditorUtility.DisplayProgressBar("Check Repetition", "Check Repetition", 0.5f);
        FileTool.q = new Queue<string>();
        FileTool.ListFiles(new DirectoryInfo(System.Environment.CurrentDirectory + "/" + "Assets/AssetbundleHUD/"));
        string[] s = FileTool.q.ToArray();
        int filesLength = (System.Environment.CurrentDirectory + "/" + "Assets/AssetbundleHUD/HUDIF2/").Length;
        Dictionary<string, string> spriteDic = new Dictionary<string, string>();
        Dictionary<string, string> MD5Dic = new Dictionary<string, string>();
        foreach (string ss in s)
        {
            string AssetPath = ss.Substring(filesLength, ss.Length - filesLength);
            checkMD5(MD5Dic, ss);
            string[] sub = AssetPath.Split('\\');
            string SpriteName = sub[sub.Length - 1];
            if (spriteDic.ContainsKey(SpriteName))
            {
                Debug.LogError("Sprite 名称 重复,SpriteName :" + SpriteName + ",\n path: " + spriteDic[SpriteName] + ",\n path:" + ss);
            }
            else
            {
                spriteDic.Add(SpriteName, ss);
            }
        }
        EditorUtility.ClearProgressBar();
        EditorUtility.DisplayProgressBar("Check Compare", "Check Compare", 0.5f);
        CompareAtlasSpriteCount();
        EditorUtility.ClearProgressBar();
    }
    private static void CompareAtlasSpriteCount()
    {
        FileTool.q = new Queue<string>();
        FileTool.ListFiles(new DirectoryInfo(System.Environment.CurrentDirectory + "/" + "Assets/AssetbundleResources/Atlas/"));
        string[] s = FileTool.q.ToArray();
        int filesLength = (System.Environment.CurrentDirectory + "/").Length;
        Dictionary<string, string> spriteDic = new Dictionary<string, string>();
        foreach (string ss in s)
        {
            string AssetPath = ss.Substring(filesLength, ss.Length - filesLength);
            string[] sub = AssetPath.Split('\\');
            string AtlasName = sub[sub.Length - 1];
            int length = ".spriteatlas".Length;
            AtlasName = AtlasName.Substring(0, AtlasName.Length - length);
            SpriteAtlas spriteAtlas = UnityEditor.AssetDatabase.LoadAssetAtPath(AssetPath, typeof(SpriteAtlas)) as SpriteAtlas;
            if (spriteAtlas == null)
                continue;
            int AtlasSpriteCount = spriteAtlas.spriteCount;
            string TexturFiles = System.Environment.CurrentDirectory + "/" + "Assets/AssetbundleHUD/HUDIF2";
            if (!ss.Contains("single"))                    //大图集不用检查吧 都是单张的
            {
                FileTool.q = new Queue<string>();
                FileTool.ListFiles(new DirectoryInfo(TexturFiles + "/" + AtlasName));
                int TextueCount = FileTool.q.Count;
                if (TextueCount != AtlasSpriteCount)
                {
                    Debug.LogError(AtlasName + "图集中Sprite数量与资源不一致!");
                }
            }
        }
    }
    private static void checkMD5(Dictionary<string, string> DIC, string path)
    {
        try
        {
            FileStream fs = new FileStream(path, FileMode.Open);
            int len = (int)fs.Length;
            byte[] data = new byte[len];
            fs.Read(data, 0, len);
            fs.Close();
            MD5 md5 = new MD5CryptoServiceProvider();
            byte[] result = md5.ComputeHash(data);
            string fileMD5 = "";
            foreach (byte b in result)
            {
                fileMD5 += Convert.ToString(b, 16);
            }
            if (DIC.ContainsKey(fileMD5))
            {
                Debug.LogError("Sprite 资源 重复:MD5:" + fileMD5+ ",\n path" + path + "\n path" + DIC[fileMD5]);
            }
            else
            {
                DIC.Add(fileMD5, path);
            }
        }
        catch (FileNotFoundException e)
        {
            Debug.LogError(e.Message);
        }
    }

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引