用途 本技能用于指导在 Unreal Engine C++ 中正确引用和加载资产。每个 .uasset 都是包中的 UObject,通过虚拟路径寻址。最关键的决策是选择硬引用还是软引用,它决定哪些内容会随类一起载入内存并被打包(cook)。
主要能力 一、硬引用与软引用。硬引用使用 TObjectPtr<T>(UPROPERTY),随所有者的加载而加载,适合小型、始终需要的资产。软引用使用 TSoftObjectPtr(对象)或 TSoftClassPtr(类),保存路径而非对象,仅在主动加载时载入,适合重型、可选或偶发使用的资产。软指针内部存储 FSoftObjectPath;IsNull() 判断路径是否为空,IsValid() 判断对象是否已在内存,二者含义不同。
二、内容路径。使用 /Game/...(项目 Content)、/Engine/...(引擎内容)、/PluginName/...(插件)等虚拟路径;完整对象引用形如 /Game/Weapons/SM_Rifle.SM_Rifle(包名.对象名)。不应在 C++ 资产引用中使用操作系统文件路径。
三、加载方式。LoadSynchronous() 同步加载会阻塞游戏线程,应少用;推荐通过 UAssetManager::GetStreamableManager().RequestAsyncLoad() 异步加载并配合 FStreamableDelegate 回调。需持有返回的 TSharedPtr<FStreamableHandle> 以保持资产驻留,释放句柄或让其离开作用域后资产可能被 GC。构造函数中可用 ConstructorHelpers::FObjectFinder/FClassFinder 解析引擎或原型资产,但仅限构造函数内使用。
四、Asset Registry。无需加载即可按类、包路径、递归路径等多条件筛选资产(GetAssetsByClass、GetAssets),FAssetData 提供包名、资产名、标签值等信息,仅在需要时才 GetAsset() 加载。标记 AssetRegistrySearchable 的属性可用于筛选。
五、UAssetManager 与主资产。适合大型内容库、DLC 或分块交付。继承 UPrimaryDataAsset 定义主资产类型,在项目设置中注册,再通过 FPrimaryAssetId 和 LoadPrimaryAsset 按 ID 加载;可通过 Asset Bundles 元数据按场景只加载所需部分(如 UI、Game)。
模块依赖 Engine(UAssetManager、FStreamableManager、ConstructorHelpers)、AssetRegistry(IAssetRegistry、FAssetData、FARFilter)、CoreUObject(TSoftObjectPtr、TSoftClassPtr、FSoftObjectPath)。
适用场景 选择类如何引用网格、材质、声音、蓝图或数据资产;排查加载卡顿与内存/打包体积膨胀;按需加载内容(利于关卡流送、插件或 DLC);运行时枚举筛选资产而不加载;为大型内容游戏搭建主资产管线。
限制与注意事项 广泛加载的类持有大量硬引用会造成内存与 cook 体积膨胀;游戏过程中同步加载会引起帧卡顿;硬编码路径字符串脆弱,应暴露可编辑的 UPROPERTY;丢失可流送句柄会导致资产被 GC;FObjectFinder 在构造函数外使用会失败或断言;忘记 AssetRegistry 模块依赖会导致编译期链接错误。UE5 中使用 TObjectPtr;FSoftObjectPath 已取代 FStringAssetReference;GetAssetsByClass 在 UE 5.1+ 应传 GetClassPathName();UE 5.3 起静态 IsValid() 弃用,改用 IsInitialized()。