3.YooAsset工具窗口

3.YooAsset工具窗口


3.1 知识点

YooAsset 的菜单功能列表

  • Home Page:跳转至 YooAsset 官方主页、文档或相关介绍页面,方便用户获取工具说明与支持。
  • AssetBundle 相关工具
    • AssetBundle Collector:资源配置界面。收集项目资源,确定哪些资源需要打包成 AssetBundle。
    • AssetBundle Builder:资源构建界面。构建工具,用于生成 AssetBundle 包,配置打包参数。
    • AssetBundle Reporter:构建报告界面。生成构建报告,展示 AssetBundle 依赖关系、大小等信息,便于分析优化。
    • AssetBundle Debugger:调试工具,用于排查 AssetBundle 加载、依赖错误等运行时问题。
  • AssetArt 相关工具
    • AssetArt Scanner:扫描项目美术资源(如模型、贴图),检测格式、尺寸等规范问题。
    • AssetArt Reporter:生成美术资源分析报告,汇总扫描结果,辅助资源管理与优化。

AssetBundle Collector 资源配置界面

顶部功能栏细节

  • 导入按钮:导入保存的 XML 配置文件,快速复用历史配置,减少重复操作。
  • 导出按钮:将当前配置数据导出为 XML 文件,便于备份、团队协作共享配置。
  • 修复按钮:当配置中的文件夹位置变动时,修正资源路径关联,确保资源引用正常。

    原来找不到,点击修复按钮后找到了

全局设置项解析

  • Show Package:控制是否展示资源包列表视图,勾选后直观呈现项目资源包结构。
  • Show Editor Alias:切换界面语言显示模式,开启后以中文展示相关功能说明。
  • Unique Bundle Name:为资源包名添加 PackageName 前缀,多 Package 场景下避免包名冲突,建议开启。

包裹设置项说明

  • Enable Addressable:启用可寻址资源定位系统,支持代码加载资源,同时兼容全路径加载方式。
  • Location To Lower:使资源定位地址大小写不敏感,简化资源加载时的地址匹配逻辑。
  • Include Asset GUID:在资源清单中记录资源 GUID 信息,精准追踪管理资源。
  • Auto Collect Shaders:自动将所有着色器打包到独立资源包,优化着色器管理与加载效率。
  • File Ignore Rule:设置全局文件忽略规则(支持扩展),如原生文件配置可选择 RawFileIgnoreRule 过滤特定文件。

资源分组配置细节

  • Active Rule:分组激活规则(支持自定义扩展)。内置规则如 EnableGroup(启用分组)、DisableGroup(禁用分组),示例代码:
    public class DisableGroup : IActiveRule {  
        public bool IsActiveGroup(GroupData groupData) {  
            return false;  
        }  
    }  
    
  • Grouper Name:定义分组名称(如 battle),标识资源分组用途。
  • Grouper Desc:添加分组备注信息,说明分组内容,方便团队协作理解。
  • Asset Tags:为分组内资源添加分类标签(多标签用分号分隔,如 level1;level2),便于资源筛选。

搜集器配置详解

  • Collect Path:指定资源收集路径,可设置文件夹或单个文件,限定收集范围。
  • Collector Type:定义收集器类型:
    • MainAssetCollector:收集主资源并写入清单,支持代码加载。
    • StaticAssetCollector:收集主资源但不写入清单,用于定制化打包。
    • DependAssetCollector:收集依赖资源,未引用依赖自动剔除。
  • AddressRule:可寻址规则(支持自定义)。内置如 AddressByFileName(按文件名定位),示例:
    public class AddressByFileName : IAddressRule {  
        string GetAssetAddress(AddressRuleData data) {  
            return Path.GetFileNameWithoutExtension(data.AssetPath);  
        }  
    }  
    
  • PackRule:打包规则(支持自定义)。内置如 PackDirectory(按文件夹打包),示例:
    public class PackDirectory : IPackRule {  
        PackRuleResult GetPackRuleResult(PackRuleData data) {  
            string bundleName = Path.GetDirectoryName(data.AssetPath);  
            return new PackRuleResult(bundleName, DefaultPackRule.AssetBundleFileExtension);  
        }  
    }  
    
  • FilterRule:过滤收集的资源类型。内置如 CollectScene(只收集场景文件),示例:
    public class CollectScene : IFilterRule {  
        public bool IsCollectAsset(FilterRuleData data) {  
            return Path.GetExtension(data.AssetPath) == ".unity";  
        }  
    }  
    
  • UserData:自定义数据,辅助定制 AddressRulePackRule,满足个性化需求。
  • Asset Tags:为搜集器内资源添加分类标签,便于后续资源管理与筛选。

AssetBundle Builder 资源构建界面

界面功能模块

  • Build Package:资源包裹列表,通过下拉选择确定需构建的资源包裹范围。
  • Build Pipeline:构建管线列表,包含多种类型:
    • EditorSimulateBuildPipeline:编辑器模拟构建管线,生成资源清单但不生成Bundle文件,用于模拟真实打包环境。
    • BuiltinBuildPipeline:内置构建管线,常规构建使用。
    • ScriptableBuildPipeline:可编程构建管线(Unity 2021.3+推荐),允许开发者控制打包流程。
    • RawFileBuildPipeline:原生文件构建管线,处理Unity无法识别的资源(如FMOD音频文件)。
  • Build Output:构建输出目录,根据Unity当前平台划分构建结果,便于管理不同平台资源。
  • Build Version:设置构建的资源包版本,用于标识补丁包等内容。
  • Clear Build Cache:清理构建缓存,勾选则重新构建所有资源包;不勾选启用增量打包,提升构建速度。
  • Use Asset Depend DB:开启后使用资源依赖关系数据库,加快资源收集与构建效率。
  • Encryption:加密类列表,支持自定义加密(需实现 IEncryptionServices 接口),包含文件偏移、内存、流等解密加载方式。
  • Compression:设置资源包压缩方式,优化包体大小。
  • File Name Style:定义输出资源包文件名样式,如 HashName(哈希值)、BundleName(资源包名)、BundleName_HashName(资源包名+哈希值)。
  • Copy Buildin File Option:首包资源拷贝方式:
    • None:不拷贝文件。
    • ClearAndCopyAll:清空后拷贝所有文件。
    • ClearAndCopyByTags:清空后按资源标签拷贝。
    • OnlyCopyAll:不清空直接拷贝所有文件。
    • OnlyCopyByTags:不清空直接按标签拷贝。

构建操作与结果

  • 构建执行:点击“构建”按钮启动多节点流程,任一节点错误则构建失败,错误信息可在控制台查看。
  • 补丁包:构建成功后,输出目录生成以“资源版本号”命名的补丁包文件夹,包含:
    • 资源清单
      • DefaultPackage.version:资源版本文件。
      • DefaultPackage_xxx.hash:记录资源清单哈希值。
      • DefaultPackage_xxx.json:Json格式,用于预览信息。
      • DefaultPackage_xxx.bytes:二进制格式,供程序读取加载。
    • 构建报告DefaultPackage_xxx.report,可通过构建报告窗口查看详细构建信息。

重要概念与注意事项

  • 增量构建:利用Unity资源构建缓存,避免重复构建,提升打包效率。
  • 首包资源:构建应用时打入首包的资源,存放于 StreamingAssets/yoo/ 目录,支持热更新。
  • SBP构建管线注意事项:需设置内置着色器资源包名称,且与自动收集的着色器资源包名一致,确保构建正确。
  • Jenkins自动化构建:参考示例代码配置构建参数(如输出目录、版本、加密等),通过代码执行构建流程,实现自动化。

AssetBundle Reporter 构建报告界面


YooAsset 构建报告工具支持查看概览信息、资源对象视图、资源包视图,且仅适配 Unity 2019.4+ 版本。要import后选择打包出来的report文件才能查看。各视图功能如下:

概览视图

  • 核心作用:呈现构建报告整体概况,包含资源包数量、资源对象总数、构建耗时、错误与警告统计等关键数据。通过概览可快速判断构建是否成功,是否存在需处理的异常问题(如大量错误/警告),从宏观层面把握构建结果。

资源对象列表视图

  • 内容展示
    • 罗列所有参与构建的资源对象,显示资源名称、类型、路径等基础信息。
    • 标注每个资源对象依赖的资源包,便于追踪资源与资源包的依赖关系。例如,分析模型资源对材质、纹理资源包的引用,辅助优化资源引用逻辑,避免依赖冗余或缺失。

资源包列表视图

  • 内容展示
    • 展示所有生成的资源包,包含资源包名称、大小、版本等信息。
    • 列出每个资源包内包含的资源对象,清晰呈现资源包内容构成。通过该视图可校验资源包是否包含预期资源,是否混入无关内容,进而优化资源包划分策略,确保资源打包的合理性与高效性。

AssetBundle Debugger 调试器界面

调试器核心功能

  1. 作用:在游戏运行时实时监控资源包加载状态,追踪资源对象引用计数,辅助定位资源泄漏问题。
  2. 资源泄漏定位:通过引用计数与资源包卸载条件,快速识别未释放的资源。
  3. 性能优化:分析加载耗时与异步任务执行链,优化资源加载策略。
  4. 依赖关系验证:校验资源包依赖关系,避免冗余加载或错误引用。

平台支持与调试配置

  • 支持版本:仅适配 **Unity 2019.4+**。
  • 安卓平台调试
    • Unity 2020/2021:直接支持。
    • Unity 2019:需通过 ADB 命令转发调试端口:
      adb forward tcp:34999 localabstract:Unity-包名  
      
  • 真机远程调试
    • 构建安装包时:勾选 Development BuildAutoconnect Profiler,确保调试器可连接。

资源对象列表视图

  • 功能:展示当前加载的所有资源对象及其关键信息:
    • 资源名称/路径:标识资源唯一性。
    • 加载耗时:资源加载耗时(毫秒),定位性能瓶颈。
    • 加载状态:如 LoadingLoadedUnloaded 等。
    • 引用计数:统计资源被引用的次数,引用计数归零时触发卸载。
    • 依赖资源包列表(Depend Bundles):选中资源加载所依赖的资源包,帮助分析资源包依赖链。

资源包列表视图

  • 功能:监控当前加载的资源包及其关联信息:
    • 资源包名称/大小:标识资源包基础属性。
    • 加载状态:如 LoadedUnloaded
    • 引用计数:资源包被引用的次数。
    • 使用中的资源(Using Asset):显示该资源包当前正在使用的资源对象列表。
    • 引用关系(Reference Bundle):展示哪些资源包引用了当前选中的资源包。
  • 资源包卸载条件
    • 资源包的 Using Asset 列表内所有资源引用计数为零。
    • 资源包的 Reference Bundle 列表内所有资源包引用计数为零。

异步操作任务列表视图

  • 功能:跟踪所有异步任务执行详情:
    • 任务类型:如资源加载、卸载、场景切换等。
    • 开始时间/耗时:记录任务启动时间与执行时长。
    • 任务状态:如 RunningCompletedFailed
    • 附加调试信息:包括错误日志、操作链上下文等。
  • 操作链分析
    • 选中异步任务后,底部显示完整操作链信息,帮助定位任务执行路径中的问题节点。

AssetArt Scanner 资产扫描器

工具界面组成

  • 左侧:资产扫描器列表,显示所有可用扫描器。
  • 中间:选中扫描器的配置界面,设置扫描规则与参数。
  • 右侧:扫描器参数检视界面,展示自定义扫描器的专属配置。

基础操作按钮

  • 导入按钮:加载保存的 XML 配置文件,复用历史扫描规则。
  • 导出按钮:将当前配置导出为 XML 文件,便于备份或团队共享。
  • 扫描所有按钮:执行全部扫描器任务,生成多份扫描报告。

扫描器配置项详解

  • Scanner Name:定义扫描器名称(如 TextureScanner),标识扫描器功能。
  • Scanner Desc:添加扫描器备注信息,说明扫描用途或规则。
  • Scanner Schema:关联扫描器模式文件(继承 ScannerSchema 的 ScriptableObject)。
  • Output Folder:设置报告文件输出目录,默认为 Assets/ScanReports
  • Collector:指定扫描路径,可配置多个文件夹或文件范围。

扫描器检视界面

  • 功能:开发者实现自定义扫描器时,可编写专属参数检视面板。
  • 实现方式:继承 SchemaInspector 类,通过 EditorGUI 绘制可视化配置项。

扫描器接口扩展

需继承基类 ScannerSchema 并实现以下核心方法:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace YooAsset.Editor
{
    public abstract class ScannerSchema : ScriptableObject
    {
        /// <summary>
        /// 获取用户指南信息
        /// </summary>
        public abstract string GetUserGuide();

        /// <summary>
        /// 运行生成扫描报告
        /// </summary>
        public abstract ScanReport RunScanner(AssetArtScanner scanner);

        /// <summary>
        /// 修复扫描结果
        /// </summary>
        public abstract void FixResult(List<ReportElement> fixList);

        /// <summary>
        /// 创建检视面板
        /// </summary>
        public virtual SchemaInspector CreateInspector()
        {
            return null;
        }
    }
}
扩展示例(太空战机DEMO中的纹理扫描器)
#if UNITY_2019_4_OR_NEWER
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEditor;
using YooAsset.Editor;
using UnityEditor.UIElements;
using UnityEngine.UIElements;

[CreateAssetMenu(fileName = "TextureSchema", menuName = "YooAssetArt/Create TextureSchema")]
public class TextureSchema : ScannerSchema
{
    /// <summary>
    /// 图片最大宽度
    /// </summary>
    public int MaxWidth = 1024;

    /// <summary>
    /// 图片最大高度
    /// </summary>
    public int MaxHeight = 1024;

    /// <summary>
    /// 测试列表
    /// </summary>
    public List<string> TestStringValues = new List<string>();
    

    /// <summary>
    /// 获取用户指南信息
    /// </summary>
    public override string GetUserGuide()
    {
        return "规则介绍:检测图片的格式,尺寸";
    }

    /// <summary>
    /// 运行生成扫描报告
    /// </summary>
    public override ScanReport RunScanner(AssetArtScanner scanner)
    {
        // 创建扫描报告
        string name = "扫描所有纹理资产";
        string desc = GetUserGuide();
        var report = new ScanReport(name, desc);
        report.AddHeader("资源路径", 600, 500, 1000).SetStretchable().SetSearchable().SetSortable().SetCounter().SetHeaderType(EHeaderType.AssetPath);
        report.AddHeader("图片宽度", 100).SetSortable().SetHeaderType(EHeaderType.LongValue);
        report.AddHeader("图片高度", 100).SetSortable().SetHeaderType(EHeaderType.LongValue);
        report.AddHeader("内存大小", 120).SetSortable().SetUnits("bytes").SetHeaderType(EHeaderType.LongValue);
        report.AddHeader("苹果格式", 100);
        report.AddHeader("安卓格式", 100);
        report.AddHeader("错误信息", 500).SetStretchable();

        // 获取扫描资源集合
        var searchDirectorys = scanner.Collectors.Select(c => { return c.CollectPath; });
        string[] findAssets = EditorTools.FindAssets(EAssetSearchType.Texture, searchDirectorys.ToArray());

        // 开始扫描资源集合
        var results = SchemaTools.ScanAssets(findAssets, ScanAssetInternal);
        report.ReportElements.AddRange(results);
        return report;
    }
    private ReportElement ScanAssetInternal(string assetPath)
    {
        var importer = TextureTools.GetAssetImporter(assetPath);
        if (importer == null)
            return null;

        // 加载纹理对象
        var texture = AssetDatabase.LoadAssetAtPath<Texture>(assetPath);
        var assetGUID = AssetDatabase.AssetPathToGUID(assetPath);
        var iosFormat = TextureTools.GetPlatformIOSFormat(importer);
        var androidFormat = TextureTools.GetPlatformAndroidFormat(importer);
        var memorySize = TextureTools.GetStorageMemorySize(texture);

        // 获取错误信息
        string errorInfo = string.Empty;
        {
            // 苹果格式
            if (iosFormat != TextureImporterFormat.ASTC_4x4)
            {
                errorInfo += " | ";
                errorInfo += "苹果格式不对";
            }

            // 安卓格式
            if (androidFormat != TextureImporterFormat.ASTC_4x4)
            {
                errorInfo += " | ";
                errorInfo += "安卓格式不对";
            }

            // 多级纹理
            if (importer.isReadable)
            {
                errorInfo += " | ";
                errorInfo += "开启了可读写";
            }

            // 超大纹理
            if (texture.width > MaxWidth || texture.height > MaxHeight)
            {
                errorInfo += " | ";
                errorInfo += "超大纹理";
            }
        }

        // 添加扫描信息
        ReportElement result = new ReportElement(assetGUID);
        result.AddScanInfo("资源路径", assetPath);
        result.AddScanInfo("图片宽度", texture.width);
        result.AddScanInfo("图片高度", texture.height);
        result.AddScanInfo("内存大小", memorySize);
        result.AddScanInfo("苹果格式", iosFormat.ToString());
        result.AddScanInfo("安卓格式", androidFormat.ToString());
        result.AddScanInfo("错误信息", errorInfo);

        // 判断是否通过
        result.Passes = string.IsNullOrEmpty(errorInfo);
        return result;
    }

    /// <summary>
    /// 修复扫描结果
    /// </summary>
    public override void FixResult(List<ReportElement> fixList)
    {
        SchemaTools.FixAssets(fixList, FixAssetInternal);
    }
    private void FixAssetInternal(ReportElement result)
    {
        var scanInfo = result.GetScanInfo("资源路径");
        var assetPath = scanInfo.ScanInfo;
        var importer = TextureTools.GetAssetImporter(assetPath);
        if (importer == null)
            return;

        // 苹果格式
        var iosPlatformSetting = TextureTools.GetPlatformIOSSettings(importer);
        iosPlatformSetting.format = TextureImporterFormat.ASTC_4x4;
        iosPlatformSetting.overridden = true;

        // 安卓格式
        var androidPlatformSetting = TextureTools.GetPlatformAndroidSettings(importer);
        androidPlatformSetting.format = TextureImporterFormat.ASTC_4x4;
        androidPlatformSetting.overridden = true;

        // 可读写
        importer.isReadable = false;

        // 保存配置
        importer.SetPlatformTextureSettings(iosPlatformSetting);
        importer.SetPlatformTextureSettings(androidPlatformSetting);
        importer.SaveAndReimport();
        Debug.Log($"修复了 : {assetPath}");
    }

    /// <summary>
    /// 创建检视面板对
    /// </summary>
    public override SchemaInspector CreateInspector()
    {
        var container = new VisualElement();

        // 图片最大宽度
        var maxWidthField = new IntegerField();
        maxWidthField.label = "图片最大宽度";
        maxWidthField.SetValueWithoutNotify(MaxWidth);
        maxWidthField.RegisterValueChangedCallback((evt) =>
        {
            MaxWidth = evt.newValue;
        });
        container.Add(maxWidthField);

        // 图片最大高度
        var maxHeightField = new IntegerField();
        maxHeightField.label = "图片最大高度";
        maxHeightField.SetValueWithoutNotify(MaxHeight);
        maxHeightField.RegisterValueChangedCallback((evt) =>
        {
            MaxHeight = evt.newValue;
        });
        container.Add(maxHeightField);

        // 创建测试列表
#if UNITY_2021_3_OR_NEWER
        ReorderableListView reorderableListView = new ReorderableListView();
        reorderableListView.SourceData = TestStringValues;
        reorderableListView.HeaderName = "测试列表";
        container.Add(reorderableListView);
#endif

        SchemaInspector inspector = new SchemaInspector(container);
        return inspector;
    }
}
#endif

扫描报告输出

  • 报告内容:包含问题资源路径、错误类型、修复建议等结构化数据。
  • 输出格式:默认生成 .json 文件,在Asset目录下,支持第三方工具解析或二次处理。

典型应用场景

  1. 美术规范检查:验证纹理尺寸、模型面数等是否符合项目标准。
  2. 资源冗余检测:扫描重复资源或未引用资产,优化包体体积。
  3. 自动化修复:批量修改资源导入设置(如压缩格式、Mipmap开关)。

AssetArt Reporter 资产扫描报告

报告核心价值

  • 问题精准定位:通过多维度过滤快速定位异常资源。
  • 自动化修复:结合扫描器 FixResult 方法实现批量修复,提升效率。
  • 团队协作:导出/导入报告文件,便于跨部门协同处理资源问题。

核心功能模块

报告导入与导出
  • 单文件导入(Import):加载单个扫描报告文件(.json 格式),查看详细扫描结果。
  • 多文件合并导入(Multi-Import):同时导入多个报告文件并合并显示(需确保扫描器一致,避免数据冲突)。
  • 选择性导出(Export Select):勾选需要导出的元素,将关联资源文件拷贝至指定目录,便于批量处理问题资源。
问题修复功能
  • 一键修复所有(Fix All):自动修复所有未通过元素(自动排除白名单和隐藏元素)。
  • 选择性修复(Fix Select):修复勾选的元素(包含白名单和隐藏元素),用于精细化修复操作。
显示控制选项
  • 显示/隐藏元素:通过“眼睛”图标开关控制隐藏元素的显隐。
  • 显示通过元素:勾选后展示扫描通过的资源项,用于完整性校验。
  • 显示白名单元素:展示已加入白名单的例外资源,避免重复扫描干扰。

注意:该工具仅支持 Unity 2019.4+ 版本。

搜索栏高级语法

通用关键字搜索

直接输入文件名、路径片段等关键词,快速过滤匹配项:

example_texture  
Assets/Art/Characters  
指定项关键字搜索

通过 字段名:关键词 格式精确搜索特定字段内容(冒号为英文小写):

错误信息:安卓格式不对  
资源类型:Texture  
指定项数值比较

使用 字段名 比较符 数值 格式进行范围筛选(**支持 =, >, >=, <, <=**):

内存大小=1024      // 等于 1024 KB  
图片宽度>1024      // 宽度大于 1024 像素  
图片高度<=2048     // 高度小于等于 2048 像素  

操作示例场景

  1. 定位纹理格式问题

    错误信息:ETC2不支持  
    

    筛选出所有因 ETC2 压缩格式导致问题的纹理资源。

  2. 检测超大资源

    内存大小>2048  
    

    查找内存占用超过 2MB 的资源,优化包体体积。

  3. 批量修复白名单资源

    • 勾选白名单元素 → 点击 Fix Select,将问题资源标记为例外,避免后续扫描重复报警。


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏