UE5 AssetManager类使用详解

文章目录

  • 前言
  • [一、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:

  1. 打开 Edit > Project Settings > Engine > General Settings
  2. 设置 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 基础异步加载

使用 LoadAssetLoadPrimaryAsset 异步加载资源:

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;
    }
);

注意事项

  1. 路径格式 :使用 FSoftObjectPathFStringAssetReference 避免硬编码路径。
  2. 内存泄漏 :确保释放 FStreamableHandle
  3. 异步回调:避免在回调中执行耗时操作。
  4. 主资源类型:在项目设置中正确定义主资源。

通过 AssetManager 可以实现高效的资源管理,尤其适合大型项目的资源动态加载需求

相关推荐
晴夏。5 小时前
UE垃圾回收的全方面讲解(通俗易懂)【底层实现、触发方式、引用保持、优化、工具】
ue5·游戏引擎·ue·垃圾回收
邪修king7 小时前
UE5:C++ 实现 游戏逻辑 ↔ UI 双向联动
c++·游戏·ue5
HAPPY酷1 天前
从Public到Private:UE5 C++类创建路径差异全解析
java·c++·ue5
1204157137 肖哥4 天前
UE5.7 Procedural Vegetation分析
ue5
半天法师4 天前
Bug 记录:UE 结构体转 JSON 时 Key 字段大小写异常 (Editor 与打包后表现不一致)
ai·ue5·json·bug
邪修king4 天前
UE5 零基础入门第四弹:UMG UI 系统入门,从静态界面到逻辑联动
c++·ui·ue5
HAPPY酷6 天前
UE5 开发工具链配置清单
ue5
晴夏。6 天前
UE5第三人称模板实现及相关引擎源码分析
unity·ue5·游戏引擎·ue
HAPPY酷6 天前
UE5 C++ 避坑指南:暴力移除 Electronic Nodes 插件,回归纯净开发
开发语言·c++·ue5
晴夏。6 天前
UE原生第三人称相机源码分析
游戏·ue5·ue4·相机·ue·3c