首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Unity-工具-检查未被使用的资源(texture、sprite、material、animation、animator)

Unity-工具-检查未被使用的资源(texture、sprite、material、animation、animator)

作者头像
祝你万事顺利
发布2019-07-11 10:23:51
发布2019-07-11 10:23:51
1.9K00
代码可运行
举报
文章被收录于专栏:Unity游戏开发Unity游戏开发
运行总次数:0
代码可运行

美术会有大量的文件资源导入,使用自动化的工具检查资源的使用情况,标记出资源引用为0的资源,用于检查无用的资源。

检查目标文件夹下的资源引用,标记出资源引用数为0的资源。

代码语言:javascript
代码运行次数:0
运行
复制
using UnityEngine;
using System.Collections;
using UnityEditor;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Collections.Generic;
using Boo.Lang;

public class FindReferences 
{
    /// <summary>
    /// 查询目标文件夹下资源的使用(.prefab/.unity/.mat/.asset)情况,标记出资源使用为0的
    /// </summary>
    [MenuItem("Tools/Find References", false, 10)]
    static private void Find()
    {
        EditorSettings.serializationMode = SerializationMode.ForceText;

        //在这里定义查找文件的类型和文件的路径
        string[] guids = AssetDatabase.FindAssets("", new string[] { "Assets/PrestreamingAssets/Scenes/City/Animations" });


        string[] allassetpaths = new string[guids.Length];
        int index = 0;
        foreach (var item in guids)//将全部GUID转换为AssetPath
        {
            allassetpaths[index] = AssetDatabase.GUIDToAssetPath(item);
            index++;
        }
        int totalGuid = index;
        Dictionary<string, int> refDic = new Dictionary<string, int>();

        List withoutExtensions = new List() { ".prefab", ".unity", ".mat", ".asset" };
        string[] files = Directory.GetFiles(Application.dataPath, "*.*", SearchOption.AllDirectories)
            .Where(s => withoutExtensions.Contains(Path.GetExtension(s).ToLower())).ToArray();
        Match(allassetpaths, index, files, refDic);
    }

    [MenuItem("Tools/Find References", true)]
    static private bool VFind()
    {
        string path = AssetDatabase.GetAssetPath(Selection.activeObject);
        return (!string.IsNullOrEmpty(path));
    }

    static private void Match(string[] allassetpaths,int index,string[] files, Dictionary<string, int> refDic)
    {
        if (index > 0 && !string.IsNullOrEmpty(allassetpaths[index - 1]))
        {
            string guid = AssetDatabase.AssetPathToGUID(allassetpaths[index - 1]);

            int startIndex = 0;
            EditorApplication.update = delegate ()
            {
                string file = files[startIndex];
                bool isCancel = EditorUtility.DisplayCancelableProgressBar("匹配资源中", file, (float)startIndex / (float)files.Length);
                if (Regex.IsMatch(File.ReadAllText(file), guid))
                {
                    if (!refDic.ContainsKey(guid))
                    {
                        refDic.Add(guid, 1);
                    }
                    else
                    {
                        refDic[guid] += 1;
                    }
                }
                else
                {
                    if (!refDic.ContainsKey(guid))
                    {
                        refDic.Add(guid, 0);
                    }
                }
                startIndex++;
                if (isCancel || startIndex >= files.Length)
                {
                    EditorUtility.ClearProgressBar();
                    EditorApplication.update = null;
                    startIndex = 0;
                    Debug.Log("匹配结束");
                    if ((index - 1) == 0)
                    {
                        OutputUnuse(refDic);
                    }
                    else
                    {
                        Match(allassetpaths, index - 1, files, refDic);
                    }
                }
            };
        }
    }
    static private void OutputUnuse(Dictionary<string, int> refDic)
    {
        Debug.Log("资源文件数量 : " + refDic.Count);
        foreach (var item in refDic)
        {
            if (item.Value == 0)
            {
                Debug.Log(AssetDatabase.GUIDToAssetPath(item.Key)+ " ---> 此资源引用次数 :" +item.Value);
            }
        }
    }
    static private string GetRelativeAssetsPath(string path)
    {
        return "Assets" + Path.GetFullPath(path).Replace(Path.GetFullPath(Application.dataPath), "").Replace('\\', '/');
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019.07.10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档