筛选冗余的图片资源

来源:互联网 发布:java工程师是干什么的 编辑:程序博客网 时间:2024/05/29 08:00
转载自:https://github.com/neoliang/FindUnUsedUITexture/blob/master/FindUnUnUsedUITexture.cs
using UnityEngine;using UnityEditor;using System.IO;using System.Linq;using System.Text.RegularExpressions;using System.Collections.Generic;using System.Text;using System;public static class LinqHelper {    public static TSource Fold(this IEnumerable source, Func func, TSource id)    {        TSource r = id;        foreach (var s in source)        {            r = func(r, s);        }        return r;    }    public static void ForEach(this IEnumerable source, Action action)    {        foreach (T element in source)            action(element);    }    public static IEnumerable SelectI(this IEnumerable source, Func action)    {        int i = 0;        foreach (var s in source)        {            yield return action(s, i);            i += 1;        }    }    public static TSource Reduce(this IEnumerable source, Func func) where TSource : new()    {        return Fold(source, func, new TSource());    }    public static void ForEachI(this IEnumerable source, Action action)    {        int i = 0;        foreach (T element in source)        {            action(element, i);            i += 1;        }    }}public static class FindUnUnUsedUITexture{    static List getUUIDsInFile(string path)    {        StreamReader file = new StreamReader(path);        List uuids = new List();        string line;        while ((line = file.ReadLine()) != null)        {            var reg = new Regex(@"([a-f0-9]{32})");            var m = reg.Match(line);            if (m.Success)            {                uuids.Add(m.Groups[0].Value);            }        }        file.Close();        return uuids;    }    // Use this for initialization    [MenuItem("Tools/UI冗余图片扫描")]    public static void Scan()    {        var uiPrefabRootDir = EditorUtility.OpenFolderPanel("选择UIPrefab目录",  "Assets","");        if (string.IsNullOrEmpty(uiPrefabRootDir))        {            return;        }        var uiPicRootDir = EditorUtility.OpenFolderPanel("选择UIPrefab目录", "Assets", "");        if (string.IsNullOrEmpty(uiPicRootDir))        {            return;        }                //find all meta and pic path        var uuidReg = new Regex(@"guid: ([a-f0-9]{32})");        var pngs = Directory.GetFiles(uiPicRootDir, "*.meta", SearchOption.AllDirectories)        .Select(p => "Assets/" + p.Replace('\\','/').Substring(Application.dataPath.Length+1))        .Where(p =>        {            return p.EndsWith(".png.meta") || p.EndsWith(".jpg.meta") || p.EndsWith(".tag.meta");        }).ToList();        var uuid2path = new Dictionary();        pngs.ForEachI((png, i) =>        {            var matcher = uuidReg.Match(File.ReadAllText(png));            var uuid = matcher.Groups[1].Value;            if (uuid2path.ContainsKey(uuid))            {                Debug.LogError("uuid dup" + uuid + " \n" + png + "\n" + uuid2path[uuid]);            }            else            {                uuid2path.Add(uuid, png.Substring(0,png.Length-5));            }            EditorUtility.DisplayProgressBar("扫描图片中", png, (float)i / pngs.Count);        });        //find all prefab and search pic uuid        var prefabs = Directory.GetFiles(uiPrefabRootDir, "*.prefab", SearchOption.AllDirectories);        var anims = Directory.GetFiles("Assets/", "*.anim", SearchOption.AllDirectories).Where(p => !p.Replace('\\', '/').Contains("Characters/"));        var allFiles = prefabs.Concat(anims).ToList();        var alluuids = allFiles        .SelectI((f, i) => {            EditorUtility.DisplayProgressBar("获取引用关系", f, (float)i / allFiles.Count);            return getUUIDsInFile(f);        }).ToList().Aggregate((a, b) => a.Concat(b).ToList()).ToList();        EditorUtility.ClearProgressBar();        //rm used pic uuid        var uuidshashset = new HashSet(alluuids);        var em = uuidshashset.GetEnumerator();        while(em.MoveNext())        {            var uuid = em.Current;            uuid2path.Remove(uuid);        }        StringBuilder sb = new StringBuilder();        sb.Append("UnUsedFiles: ");        sb.Append(uuid2path.Count);        sb.Append("\n");        uuid2path.ForEach(kv => sb.Append(kv.Value +"\n"));        File.WriteAllText("Assets/unusedpic.txt", sb.ToString());        EditorUtility.DisplayDialog("扫描成功", string.Format("共找到{0}个冗余图片\n请在Assets/unsedpic.txt查看结果",uuid2path.Count), "ok");    }}
原创粉丝点击