Unity 资源被引用查找(资源清理)工具

这篇具有很好参考价值的文章主要介绍了Unity 资源被引用查找(资源清理)工具。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

随着需求的迭代,会发现项目中存在很多无用资源,这些无用的资源导致包体增大。想去删除这些资源,但是害怕有其他资源引用这些文件,所以做了这个工具来检索资源的被引用情况

直接上源码吧

using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
using UnityEditor;
using UnityEngine;
using Object = UnityEngine.Object;

namespace S 
{
    public class DependAnalysis : EditorWindow
    {
        private static Object[] targetObjects;
        private bool[] foldoutArr;
        private Object[][] beDependArr;
        private static int targetCount;
        private Vector2 scrollPos;
        string[] withoutExtensions = new string[]{".prefab",".unity",".mat",".asset",".controller"};
        
        [MenuItem("Assets/查找被引用", false, 19)]
        static void FindReferences()
        {
            targetObjects=Selection.GetFiltered<Object>(SelectionMode.Assets);
            targetCount=targetObjects == null ? 0 : targetObjects.Length;
            if (targetCount == 0) return;
            DependAnalysis window = GetWindow<DependAnalysis>("依赖分析");
            window.Init();
            window.Show();
        }

        void Init()
        {
            beDependArr=new Object[targetCount][];
            foldoutArr=new bool[targetCount];
            EditorStyles.foldout.richText = true;
            for (int i = 0; i < targetCount; i++)beDependArr[i] = GetBeDepend(targetObjects[i]);
        }

        private void OnGUI()
        {
            if (beDependArr.Length != targetCount) return;
            scrollPos=EditorGUILayout.BeginScrollView(scrollPos);
            Object[] objArr;
            int count;
            string objName;
            for (int i = 0; i < targetCount; i++)
            {
                objArr = beDependArr[i];
                count = objArr == null ? 0 : objArr.Length;
                objName = Path.GetFileName(AssetDatabase.GetAssetPath(targetObjects[i]));
                string info = count == 0
                    ? $"<color=yellow>{objName}【{count}】</color>"
                    : $"{objName}【{count}】";
                foldoutArr[i] = EditorGUILayout.Foldout(foldoutArr[i], info);
                if (foldoutArr[i])
                {
                    if (count>0)
                    {
                        foreach (var obj in objArr)
                        {
                            EditorGUILayout.BeginHorizontal();
                            GUILayout.Space(15);
                            EditorGUILayout.ObjectField(obj,typeof(Object));
                            EditorGUILayout.EndHorizontal();
                        }
                    }
                    else
                    {
                        EditorGUILayout.BeginHorizontal();
                        GUILayout.Space(15);
                        EditorGUILayout.LabelField("【Null】");
                        EditorGUILayout.EndHorizontal();
                    }
                }
            }
            EditorGUILayout.EndScrollView();
        }

        /// <summary>
        /// 查找所有引用目标资源的物体
        /// </summary>
        /// <param name="target">目标资源</param>
        /// <returns></returns>
        private Object[] GetBeDepend(Object target)
        {
            if (target == null) return null;
            string path = AssetDatabase.GetAssetPath(target);
            if (string.IsNullOrEmpty(path)) return null;
            string guid = AssetDatabase.AssetPathToGUID(path);
            string[] files = Directory.GetFiles(Application.dataPath, "*",
                SearchOption.AllDirectories).Where(s => withoutExtensions.Contains(Path.GetExtension(s).ToLower())).ToArray();
            List<Object> objects= new List<Object>();
            foreach (var file in files)
            {
                string assetPath = file.Replace(Application.dataPath,"");
                assetPath = "Assets"+assetPath;
                string readText = File.ReadAllText(file);
                
                if (!readText.StartsWith("%YAML"))
                {
                    var depends = AssetDatabase.GetDependencies(assetPath, false);
                    if (depends!=null)
                    {
                        foreach (var dep in depends)
                        {
                            if (dep==path)
                            {
                                objects.Add(AssetDatabase.LoadAssetAtPath<Object>(assetPath));
                                break;
                            }
                        }
                    }
                }else if (Regex.IsMatch(readText,guid))objects.Add(AssetDatabase.LoadAssetAtPath<Object>(assetPath));
            }
            return objects.ToArray();
        }

        private void OnDestroy()
        {
            targetObjects = null;
            beDependArr = null;
            foldoutArr = null;
        }
    }
}

工具截图

unity清理无用资源,Unity 编辑器拓展,unity,游戏引擎,c#文章来源地址https://www.toymoban.com/news/detail-718989.html

使用方法

  1. 选中需要检测的一个或多个资源
  2. 右键–>查找被引用
  3. 打开分析面板,黄色字体显示的部分为无用资源(有可能是代码引用查不出来,需要根据工程特殊分析)

到了这里,关于Unity 资源被引用查找(资源清理)工具的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity_FairyGUI发布导入Unity编辑器资源报错

    报错: FairyGUI: settings for \\\'Assets/UI/XMUI/XMSubway_atlas0.png\\\' is wrong! Correct values are: (Generate Mip Maps=unchecked) UnityEngine.Debug:LogWarning (object) FairyGUI.UIPackage:LoadAtlas (FairyGUI.PackageItem) (at Assets/FairyGUI/Scripts/UI/UIPackage.cs:1305) FairyGUI.UIPackage:GetItemAsset (FairyGUI.PackageItem) (at Assets/FairyGUI/Scripts/UI/UIPa

    2024年02月04日
    浏览(48)
  • Unity 编辑器-查找所有未被使用的Prefab

    需求 接到一个需求,将Res里所有特效相关的prefab检查一下,没有使用的移除。 分析 先拆解一下需求,如下 代码 结果 结果如图所示。每组元素第一个为查找的prefab,之后的是使用了该prefab的预设或配表。 如果一组元素只有一个对象,则这个prefab无引用。 顶部的按钮为指定功

    2024年02月16日
    浏览(51)
  • 【Unity 实用插件篇】| ReferenceFinder 引用查找插件,提高引擎查找使用效率

    前言 ReferenceFinder 是一个比较小众的插件

    2024年02月16日
    浏览(45)
  • 编辑器脚本:Unity中如何查找哪些物体上有missing的脚本

    编辑器中选中物体,判断这些物体及子物体上是否有丢失的脚本 1、编辑器选中n个物体 2、获取这n个物体及其它们的子物体,数据集记为A 3、A中全部物体判断他们是否有null的脚本(MonoBehaviour) 4、判断一个物体(obj)是否有空脚本的关键语句: obj.GetComponentsMonoBehaviour().Any(mon

    2024年02月14日
    浏览(47)
  • 【Unity编辑器】使用AssetDatabase创建、删、改、加载资源

    AssetDatabase是Unity编辑器环境下的一种API,主要用于在代码中对项目中的资源进行管理和操作。注意:AssetDatabase的这些方法只能在Unity编辑器环境下运行,不能在构建后的游戏中使用。在游戏运行时,你需要使用其他资源加载方法,如Resources.Load、AssetBundle加载或者Addressables等。

    2024年01月21日
    浏览(50)
  • Unity 编辑器资源导入处理函数 OnPreprocessAudio :深入解析与实用案例

    点击封面跳转下载页面 在 Unity 中,资源导入是一个非常重要的环节,它决定了资源在项目中的使用方式和效果。Unity 提供了一系列的资源导入处理函数,其中之一就是 OnPreprocessAudio 。这个函数可以在资源导入过程中对音频资源进行自定义处理,例如修改导入设置、修改音频

    2024年02月13日
    浏览(55)
  • Unity 编辑器资源导入处理函数 OnPreprocessTexture:深入解析与实用案例

    点击封面跳转下载页面 在Unity中,我们可以使用编辑器资源导入处理函数( OnPreprocessTexture )来自定义处理纹理资源的导入过程。这个函数是继承自 AssetPostprocessor 类的,通过重写这个函数,我们可以在纹理资源导入之前执行一些自定义的操作。 首先,我们需要创建一个继承

    2024年02月12日
    浏览(51)
  • Unity 编辑器资源导入处理函数 OnPostprocessTexture :深入解析与实用案例

    点击封面跳转下载页面 在Unity中,我们可以使用编辑器资源导入处理函数( OnPostprocessTexture )来自定义处理纹理资源的导入过程。这个函数是继承自 AssetPostprocessor 类的,通过重写这个函数,我们可以在纹理资源导入完成后执行一些自定义的操作。 首先,我们需要创建一个继

    2024年02月09日
    浏览(40)
  • Unity 编辑器资源导入处理函数 OnPostprocessAudio :深入解析与实用案例

    点击封面跳转下载页面 在Unity中,我们可以使用编辑器资源导入处理函数( OnPostprocessAudio )来自定义处理音频资源的导入过程。这个函数是继承自 AssetPostprocessor 类的,通过重写这个函数,我们可以在音频资源导入完成后执行一些自定义的操作。 首先,我们需要创建一个继

    2024年02月14日
    浏览(45)
  • 盘点Unity几款编辑器扩展工具

    unity 编辑器一个不容忽视的强大之处就是非常易于自定义扩展工具,来满足各种各样的美术、策划及程序上的需求。今天为大家介绍Asset Store资源商店中几款实用的编辑器扩展工具,帮助大家直接在Unity编辑器中完成3D建模与调整工作,免去与其它软件进行数据转换的过程,从

    2024年04月09日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包