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:自定义数据,辅助定制
AddressRule
和PackRule
,满足个性化需求。 - 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 调试器界面
调试器核心功能
- 作用:在游戏运行时实时监控资源包加载状态,追踪资源对象引用计数,辅助定位资源泄漏问题。
- 资源泄漏定位:通过引用计数与资源包卸载条件,快速识别未释放的资源。
- 性能优化:分析加载耗时与异步任务执行链,优化资源加载策略。
- 依赖关系验证:校验资源包依赖关系,避免冗余加载或错误引用。
平台支持与调试配置
- 支持版本:仅适配 **Unity 2019.4+**。
- 安卓平台调试:
- Unity 2020/2021:直接支持。
- Unity 2019:需通过 ADB 命令转发调试端口:
adb forward tcp:34999 localabstract:Unity-包名
- 真机远程调试:
- 构建安装包时:勾选
Development Build
和Autoconnect Profiler
,确保调试器可连接。
- 构建安装包时:勾选
资源对象列表视图
- 功能:展示当前加载的所有资源对象及其关键信息:
- 资源名称/路径:标识资源唯一性。
- 加载耗时:资源加载耗时(毫秒),定位性能瓶颈。
- 加载状态:如
Loading
、Loaded
、Unloaded
等。 - 引用计数:统计资源被引用的次数,引用计数归零时触发卸载。
- 依赖资源包列表(Depend Bundles):选中资源加载所依赖的资源包,帮助分析资源包依赖链。
资源包列表视图
- 功能:监控当前加载的资源包及其关联信息:
- 资源包名称/大小:标识资源包基础属性。
- 加载状态:如
Loaded
、Unloaded
。 - 引用计数:资源包被引用的次数。
- 使用中的资源(Using Asset):显示该资源包当前正在使用的资源对象列表。
- 引用关系(Reference Bundle):展示哪些资源包引用了当前选中的资源包。
- 资源包卸载条件:
- 资源包的
Using Asset
列表内所有资源引用计数为零。 - 资源包的
Reference Bundle
列表内所有资源包引用计数为零。
- 资源包的
异步操作任务列表视图
- 功能:跟踪所有异步任务执行详情:
- 任务类型:如资源加载、卸载、场景切换等。
- 开始时间/耗时:记录任务启动时间与执行时长。
- 任务状态:如
Running
、Completed
、Failed
。 - 附加调试信息:包括错误日志、操作链上下文等。
- 操作链分析:
- 选中异步任务后,底部显示完整操作链信息,帮助定位任务执行路径中的问题节点。
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目录下,支持第三方工具解析或二次处理。
典型应用场景
- 美术规范检查:验证纹理尺寸、模型面数等是否符合项目标准。
- 资源冗余检测:扫描重复资源或未引用资产,优化包体体积。
- 自动化修复:批量修改资源导入设置(如压缩格式、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 像素
操作示例场景
定位纹理格式问题:
错误信息:ETC2不支持
筛选出所有因 ETC2 压缩格式导致问题的纹理资源。
检测超大资源:
内存大小>2048
查找内存占用超过 2MB 的资源,优化包体体积。
批量修复白名单资源:
- 勾选白名单元素 → 点击
Fix Select
,将问题资源标记为例外,避免后续扫描重复报警。
- 勾选白名单元素 → 点击
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com