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 可以实现高效的资源管理,尤其适合大型项目的资源动态加载需求

相关推荐
哎呦哥哥和巨炮叔叔12 小时前
虚幻引擎 5.5 能否取代 V-Ray?现代建筑可视化渲染技术对比解析
ue5·实时渲染·虚幻引擎5·建筑可视化·渲染101云渲染·v-ray渲染·建筑效果图
zhangzhangkeji14 小时前
UE5 多线程(4):资源竞争与原子变量。UE 建议使用 STL版本的原子量,不用自己版本的原子量 TAtomic<T> 的实现了
ue5
AI视觉网奇14 小时前
ue slot 插槽用法笔记
笔记·学习·ue5
lllljz15 小时前
Blender导出模型到Unity或UE5引擎材质丢失模型出错
unity·ue5·游戏引擎·blender·材质
AI视觉网奇15 小时前
blender fbx 比例不对 比例调整
笔记·学习·ue5
哎呦哥哥和巨炮叔叔15 小时前
Unreal Engine 是否支持光线追踪?UE5 光线追踪原理与性能解析
ue5·unreal engine·光线追踪·lumen·实时渲染·渲染101云渲染·ue云渲染
zhangzhangkeji15 小时前
UE5 多线程(3):线程退出与单例线程
ue5
AI视觉网奇16 小时前
static mesh 转skeleton mesh
笔记·学习·ue5
AI视觉网奇1 天前
metahuman 购买安装记录
笔记·学习·ue5
速冻鱼Kiel1 天前
虚幻状态树解析
ue5·游戏引擎·虚幻