文章目录
- 前言
- [一、AssetManager 基础使用](#一、AssetManager 基础使用)
-
- [1.1 初始化](#1.1 初始化)
- 二、异步资源加载
-
- [2.1 基础异步加载](#2.1 基础异步加载)
- [2.2 批量加载资源](#2.2 批量加载资源)
- [三、主资源(Primary Assets)](#三、主资源(Primary Assets))
-
- [3.1 定义主资源类型](#3.1 定义主资源类型)
- [3.2 加载主资源](#3.2 加载主资源)
- 四、资源释放
-
- [4.1 手动释放资源](#4.1 手动释放资源)
- [4.2 自动垃圾回收](#4.2 自动垃圾回收)
- 五、高级功能
-
- [5.1 资源依赖扫描](#5.1 资源依赖扫描)
- [5.2 资源审计](#5.2 资源审计)
- 注意事项
前言
在 Unreal Engine 中,AssetManager 是资源管理的核心类,主要负责异步资源加载、卸载、主资源(Primary Assets)管理和资源审计等功能。以下是结合代码的详细说明:
一、AssetManager 基础使用
1.1 初始化
在项目设置中启用 Asset Manager:
- 打开 Edit > Project Settings > Engine > General Settings
- 设置 Asset Manager Class 为自定义类(如 UMyAssetManager)
cpp
// 自定义 AssetManager 示例
class MYPROJECT_API UMyAssetManager : public UAssetManager
{
GENERATED_BODY()
public:
virtual void StartInitialLoading() override;
};
void UMyAssetManager::StartInitialLoading()
{
Super::StartInitialLoading();
// 初始化逻辑(如加载全局资源)
}
二、异步资源加载
2.1 基础异步加载
使用 LoadAsset 或 LoadPrimaryAsset 异步加载资源:
cpp
void LoadTextureAsync()
{
FStreamableManager& Streamable = UAssetManager::GetStreamableManager();
FSoftObjectPath TexturePath(TEXT("/Game/Textures/MyTexture.MyTexture"));
TSharedPtr<FStreamableHandle> Handle = Streamable.RequestAsyncLoad(
TexturePath,
FStreamableDelegate::CreateUObject(this, &ThisClass::OnTextureLoaded)
);
}
void OnTextureLoaded()
{
UTexture2D* LoadedTexture = Cast<UTexture2D>(
UAssetManager::GetStreamableManager().GetLoadedAsset(TexturePath)
);
UE_LOG(LogTemp, Warning, TEXT("Texture Loaded: %s"), *LoadedTexture->GetName());
}
2.2 批量加载资源
cpp
TArray<FSoftObjectPath> AssetsToLoad;
AssetsToLoad.Add(FSoftObjectPath(TEXT("/Game/Meshes/Weapon_Sword")));
AssetsToLoad.Add(FSoftObjectPath(TEXT("/Game/Animations/Character_Idle")));
FStreamableManager& Streamable = UAssetManager::GetStreamableManager();
TSharedPtr<FStreamableHandle> Handle = Streamable.RequestAsyncLoad(
AssetsToLoad,
FStreamableDelegate::CreateLambda([](){
UE_LOG(LogTemp, Warning, TEXT("All assets loaded!"));
})
);
三、主资源(Primary Assets)
主资源是游戏中需要显式管理的核心资源(如角色、武器、关卡等)。
3.1 定义主资源类型
在 DefaultEngine.ini 中配置:
cpp
[/Script/Engine.AssetManagerSettings]
+PrimaryAssetTypesToScan=(PrimaryAssetType="Weapon", AssetBaseClass="/Script/Engine.Blueprint", Directories=("/Game/Blueprints/Weapons"))
3.2 加载主资源
cpp
void LoadPrimaryAsset()
{
UAssetManager& Manager = UAssetManager::Get();
FPrimaryAssetId WeaponID("Weapon", "RocketLauncher");
TSharedPtr<FStreamableHandle> Handle = Manager.LoadPrimaryAsset(
WeaponID,
TArray<FName>(),
FStreamableDelegate::CreateUObject(this, &ThisClass::OnWeaponLoaded)
);
}
void OnWeaponLoaded()
{
UBlueprint* WeaponBP = Cast<UBlueprint>(
UAssetManager::Get().GetPrimaryAssetObject(WeaponID)
);
if (WeaponBP) {
AActor* SpawnedWeapon = GetWorld()->SpawnActor(WeaponBP->GeneratedClass);
}
}
四、资源释放
4.1 手动释放资源
cpp
void UnloadAssets()
{
FStreamableManager& Streamable = UAssetManager::GetStreamableManager();
if (Handle.IsValid())
{
Handle->ReleaseHandle(); // 释放加载句柄
Handle.Reset();
}
}
4.2 自动垃圾回收
cpp
// 强制触发垃圾回收(慎用)
GetWorld()->ForceGarbageCollection(true);
五、高级功能
5.1 资源依赖扫描
cpp
TArray<FName> Bundles;
TArray<FSoftObjectPath> Assets;
UAssetManager::Get().GetPrimaryAssetDependencies(WeaponID, Bundles, Assets);
5.2 资源审计
cpp
UAssetManager::Get().GetAssetRegistry().EnumerateAllAssets(
[](const FAssetData& AssetData) {
UE_LOG(LogTemp, Warning, TEXT("Found asset: %s"), *AssetData.AssetName.ToString());
return true;
}
);
注意事项
- 路径格式 :使用 FSoftObjectPath 或 FStringAssetReference 避免硬编码路径。
- 内存泄漏 :确保释放 FStreamableHandle。
- 异步回调:避免在回调中执行耗时操作。
- 主资源类型:在项目设置中正确定义主资源。
通过 AssetManager 可以实现高效的资源管理,尤其适合大型项目的资源动态加载需求