前言
在 Unreal Engine 中,AssetManager 是资源管理的核心类,重要负责异步资源加载、卸载、主资源(Primary Assets)管理和资源审计等功能。以下是结合代码的详细阐明:
一、AssetManager 基础使用
1.1 初始化
在项目设置中启用 Asset Manager:
- 打开 Edit > Project Settings > Engine > General Settings
- 设置 Asset Manager Class 为自界说类(如 UMyAssetManager)
- // 自定义 AssetManager 示例
- class MYPROJECT_API UMyAssetManager : public UAssetManager
- {
- GENERATED_BODY()
- public:
- virtual void StartInitialLoading() override;
- };
- void UMyAssetManager::StartInitialLoading()
- {
- Super::StartInitialLoading();
- // 初始化逻辑(如加载全局资源)
- }
复制代码 二、异步资源加载
2.1 基础异步加载
使用 LoadAsset 或 LoadPrimaryAsset 异步加载资源:
- 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 批量加载资源
- 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 中设置:
- [/Script/Engine.AssetManagerSettings]
- +PrimaryAssetTypesToScan=(PrimaryAssetType="Weapon", AssetBaseClass="/Script/Engine.Blueprint", Directories=("/Game/Blueprints/Weapons"))
复制代码 3.2 加载主资源
- 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 手动释放资源
- void UnloadAssets()
- {
- FStreamableManager& Streamable = UAssetManager::GetStreamableManager();
- if (Handle.IsValid())
- {
- Handle->ReleaseHandle(); // 释放加载句柄
- Handle.Reset();
- }
- }
复制代码 4.2 自动垃圾回收
- // 强制触发垃圾回收(慎用)
- GetWorld()->ForceGarbageCollection(true);
复制代码 五、高级功能
5.1 资源依赖扫描
- TArray<FName> Bundles;
- TArray<FSoftObjectPath> Assets;
- UAssetManager::Get().GetPrimaryAssetDependencies(WeaponID, Bundles, Assets);
复制代码 5.2 资源审计
- UAssetManager::Get().GetAssetRegistry().EnumerateAllAssets(
- [](const FAssetData& AssetData) {
- UE_LOG(LogTemp, Warning, TEXT("Found asset: %s"), *AssetData.AssetName.ToString());
- return true;
- }
- );
复制代码 留意事项
- 路径格式:使用 FSoftObjectPath 或 FStringAssetReference 避免硬编码路径。
- 内存泄漏:确保释放 FStreamableHandle。
- 异步回调:避免在回调中执行耗时操作。
- 主资源类型:在项目设置中正确界说主资源。
通过 AssetManager 可以实现高效的资源管理,尤其适合大型项目的资源动态加载需求
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |