AssetManager
请先阅读官方文档:资源管理
/**
* A singleton UObject that is responsible for loading and unloading PrimaryAssets, and maintaining game-specific asset references
* Games should override this class and change the class reference
*/
突然发现内容有点少,既然提到了asset manager,那我们把资源加载、资源引用也一并学了吧。
参考官方文档:
阅读之后,你应该知道:
- 什么是SoftObject、软引用
- 资源加载:LoadObject<> 和 FStreamableManager的作用
(FStreamableManager实例可以通过AssetManager::GetStreamableManager()
来获得。与AssetManager不同,在引擎中可以有多个FStreamableManager。) - 你可以利用资源注册表和对象库检索资源
RPGAssetManager.h/cpp
// Copyright 1998-2019 Epic Games, Inc. All Rights Reserved.
#pragma once
#include "ActionRPG.h"
#include "Engine/AssetManager.h"
#include "RPGAssetManager.generated.h"
class URPGItem;
/**
* Game implementation of asset manager, overrides functionality and stores game-specific types
* It is expected that most games will want to override AssetManager as it provides a good place for game-specific loading logic
* This is used by setting AssetManagerClassName in DefaultEngine.ini
*/
UCLASS()
class ACTIONRPG_API URPGAssetManager : public UAssetManager
{
GENERATED_BODY()
public:
// Constructor and overrides
URPGAssetManager() {}
virtual void StartInitialLoading() override;
/** Static types for items */
static const FPrimaryAssetType PotionItemType;
static const FPrimaryAssetType SkillItemType;
static const FPrimaryAssetType TokenItemType;
static const FPrimaryAssetType WeaponItemType;
/** Returns the current AssetManager object */
static URPGAssetManager& Get();
/**
* Synchronously loads an RPGItem subclass, this can hitch but is useful when you cannot wait for an async load
* This does not maintain a reference to the item so it will garbage collect if not loaded some other way
*
* @param PrimaryAssetId The asset identifier to load
* @param bDisplayWarning If true, this will log a warning if the item failed to load
*/
URPGItem* ForceLoadItem(const FPrimaryAssetId& PrimaryAssetId, bool bLogWarning = true);
};
源文件:
// Copyright 1998-2019 Epic Games, Inc. All Rights Reserved.
#include "RPGAssetManager.h"
#include "Items/RPGItem.h"
#include "AbilitySystemGlobals.h"
const FPrimaryAssetType URPGAssetManager::PotionItemType = TEXT("Potion");
const FPrimaryAssetType URPGAssetManager::SkillItemType = TEXT("Skill");
const FPrimaryAssetType URPGAssetManager::TokenItemType = TEXT("Token");
const FPrimaryAssetType URPGAssetManager::WeaponItemType = TEXT("Weapon");
/** 获得asset manager单例*/
URPGAssetManager& URPGAssetManager::Get()
{
URPGAssetManager* This = Cast<URPGAssetManager>(GEngine->AssetManager);
if (This)
{
return *This;
}
else
{
UE_LOG(LogActionRPG, Fatal, TEXT("Invalid AssetManager in DefaultEngine.ini, must be RPGAssetManager!"));
return *NewObject<URPGAssetManager>(); // never calls this
}
}
/** Starts initial load, gets called from InitializeObjectReferences */
void URPGAssetManager::StartInitialLoading()
{
Super::StartInitialLoading();
// 加载GAS中的全局数据,如tag等
UAbilitySystemGlobals::Get().InitGlobalData();
}
/** 同步加载指定资源 , TryLoad() 会调用 LoadObject()*/
URPGItem* URPGAssetManager::ForceLoadItem(const FPrimaryAssetId& PrimaryAssetId, bool bLogWarning)
{
FSoftObjectPath ItemPath = GetPrimaryAssetPath(PrimaryAssetId);
// This does a synchronous load and may hitch
URPGItem* LoadedItem = Cast<URPGItem>(ItemPath.TryLoad());
if (bLogWarning && LoadedItem == nullptr)
{
UE_LOG(LogActionRPG, Warning, TEXT("Failed to load item for identifier %s!"), *PrimaryAssetId.ToString());
}
return LoadedItem;
}
网友评论