资产注册表与编辑器查询

自动关联目录:资产注册表与编辑器查询

1. 定位

资产注册表(Asset Registry)是"不用加载资产就能查资产"的索引:编辑器里的内容浏览器、引用查询、批量操作都靠它。

一句话定位:它解决的是"我知道有一批资产,但不想为了找它们把资产全加载进内存"。

2. 它存什么

内容说明
资产路径与名称FPackageName / FAssetData
资产类型UClass 信息
标签(Tags)从资产的序列化数据里提取的键值对
依赖关系谁引用了谁(GetDependencies)
磁盘上的元数据不需要加载就能读

关键:这些信息来自资产的序列化摘要,不加载完整对象——这是它快的原因,也是它信息有限的原因。

3. 常见用途

用途说明
内容浏览器的搜索与过滤编辑器侧
批量查找某类资产如"找出所有武器数据资产"
引用关系查询谁引用了这个资产(删除前的安全检查)
打包时的依赖分析见 Cook 与打包流程
运行时加载前的枚举配合 AssetManager

4. 用法

FAssetRegistryModule& ARM =
    FModuleManager::LoadModuleChecked<FAssetRegistryModule>("AssetRegistry");
IAssetRegistry& AR = ARM.Get();

// 扫描(编辑器内)
AR.ScanPathsSynchronous({ TEXT("/Game/Items") });

// 查询
FARFilter Filter;
Filter.ClassPaths.Add(UMyItemData::StaticClass()->GetClassPathName());
Filter.bRecursiveClasses = true;

TArray<FAssetData> Assets;
AR.GetAssets(Filter, Assets);

// 取标签值
FAssetDataValue Value;
AssetData.GetTagValue(TEXT("Rarity"), Value);
API用途
GetAssets(Filter)按条件查资产
GetDependencies / GetReferencers依赖与反向依赖
GetAssetByObjectPath精确取一个
ScanPathsSynchronous同步扫描目录
OnAssetAdded / OnAssetRemoved变更通知

5. 与 AssetManager 的关系

Asset RegistryAssetManager
层底层索引上层的运行时管理
主要场景编辑器工具、批量查询运行时加载与打包
是否加载资产否是(按需)
PrimaryAsset不区分核心概念

运行时该用 AssetManager,不该直接用 Asset Registry——后者主要是编辑器工具链与打包期用的。详见 AssetManager 与 PrimaryAsset。

6. 代价与权衡

设计收益代价什么时候不该用
注册表查询不加载资产,极快只有摘要信息,读不到完整属性需要读属性就必须加载
异步扫描不卡编辑器结果延后到达需要同步结果时改用同步扫描
自定义标签可按业务维度过滤要在资产序列化时写入简单项目不必
依赖查询安全删除、影响面分析大项目查询较慢偶尔用即可

7. 踩坑与排查

坑现象怎么验证
运行时直接用注册表打包后可能不完整改用 AssetManager
查询前没扫描查不到新资产ScanPathsSynchronous 或等待扫描完成
依赖异步扫描却同步用结果为空等扫描完成回调
想读的属性不是标签读不到只能加载资产后读
打包后某些查询失效编辑器专用数据不在包里区分编辑器/运行时路径
大项目批量查询慢卡加缓存、缩小过滤范围

8. 排查顺序

1. 查不到资产?→ 是否扫描过;过滤条件是否正确
2. 读不到属性?→ 该属性不是标签 → 必须加载资产
3. 打包后失效?→ 是否用了编辑器专用数据
4. 运行时需求?→ 改用 AssetManager
5. 慢?→ 缩小过滤范围、缓存结果

参考