欢迎您光临本站,秉承服务宗旨,履行"站长"责任,销售只是起点,服务永无止境!

数据资产和异步加载的资产管理器

作者 : qwe789 本文共4469个字,预计阅读时间需要12分钟 发布时间: 2023-01-31 共1.35K人阅读
广告
也想出现在这里? 联系我们

什么是资产管理?

虚幻引擎中的资源管理器可以让你管理内容,更好地控制加载/卸载,甚至在设置正确时只加载资源的一部分(通过在“主要资源”中使用对这些“次要内容”的软引用,例如武器数据资产中的Actor类软引用)

我建议阅读官方文档页面,因为我尽量不要重复太多已经解释的内容。相反,我将使用本文来更多地以示例为导向,并从我个人的角度和用例出发。

您的项目必须将某些类定义为主资产(这些类通常可能派生自主数据资产,但可以从任何 UObject 派生)。这些是您将管理的资产,系统将加载/卸载任何引用的内容(也称为“辅助资产”),例如网格和纹理。您可以通过覆盖UObject.h中的GetPrimaryAssetId()将这些“次要资产”(默认情况下所有内容都被视为次要资产)转换为主要资产:

/**
* Returns an Type:Name pair representing the PrimaryAssetId for this object.
* Assets that need to be globally referenced at runtime should return a valid Identifier.
* If this is valid, the object can be referenced by identifier using the AssetManager 
*/
virtual FPrimaryAssetId GetPrimaryAssetId() const;

主要资产的一个例子是 AI 配置资产,其中包含有关特定怪物的信息,以及为该 AI 生成的 Actor、一些属性、能力,也许还有一些 UI 内容,如名称和图标。

下面是一个带有 MonsterData 的 PrimaryAsset 示例,来自我在 GitHub 上的 ActionRoguelike。用例是将AI生成到世界中的基本配置。这些行动是它被授予的能力。

UCLASS()
class ACTIONROGUELIKE_API USMonsterData : public UPrimaryDataAsset
{
 GENERATED_BODY()
public:

 UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Spawn Info")
 TSubclassOf<AActor> MonsterClass;
 
 /* Actions/buffs to grant this Monster */
 UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Spawn Info")
 TArray<TSubclassOf<USAction>> Actions;

 UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "UI")
 UTexture2D* Icon;

 FPrimaryAssetId GetPrimaryAssetId() const override
 {
 return FPrimaryAssetId("Monsters", GetFName());
 }
};

主要资产的另一个示例是武器数据资产,其中包含变量和软引用,例如武器Actor类,伤害类型,图标纹理,UI名称,稀有度等。

如果你正在寻找一个动手的外观,我建议你在GitHub上查看我的Action Roguelike项目。它包含一些使用资源管理器异步加载示例。Epic的ActionRPG也使用资源管理器(但有阻塞负载),对于查看主要资产的更多用例仍然很有用。

主要资产

虚幻引擎中的资源管理器通过主要资源工作,它会根据我们的请求加载和卸载这些资源。在这方面,它类似于软引用,只是我们使用 FPrimaryAssetId(具有类型和名称的结构)来指向我们希望加载的特定资产。

您可以使用UPrimaryDataAsset,也可以覆盖任何UObject派生类中的GetPrimaryAssetId(),如前所述,将其转换为主资产。它们在前面的 MonsterData 示例中的代码方面看起来非常相似。

数据资产和异步加载的资产管理器
WARPSQUAD 中“突变”的数据资产示例。
数据资产和异步加载的资产管理器
WARPSQUAD 中“飞船配置”的数据资产示例。

UPrimaryDataAsset (UDataAsset)

已设置为支持资源管理器的数据资产类。这些资产将纯粹保存数据,没有功能逻辑。您可以包括要生成的Actor类,要授予的能力,UI名称,图标等。

你可以把它看作是描述符,用来描述 AI 工作节点(生命值、授予的能力、生成的 actor 类、使用的行为树),而不是它的实际逻辑和大脑。

FPrimaryAssetId & FPrimaryAssetType

主要资产ID和类型都是美化的FNames,并对资产进行分类/识别。这是指向要加载的特定资产的方式,类似于您可能习惯的软引用。

例如,我的飞船类型为 ShipConfig,其中一个指向特定数据资产的 ID 可能看起来像 ShipConfig:MyPirateShip (该 ID 组合了类型:名称)您不会手动键入每个 ID,而是可以在 C++ 中覆盖资产上的 GetPrimaryAssetId,以处理您希望如何生成/处理 Id。您可能只想返回资产文件的名称。

下面是为数据资产设置 Id 的示例实现。

FPrimaryAssetId ULZItemData::GetPrimaryAssetId() const
{
    return FPrimaryAssetId(ItemType, GetFName());
}

异步加载

这方面是我在深入研究资源管理器时能找到最少的信息。因此,我想分享一些有关如何异步加载资产的代码示例(也可在 GitHub 上找到)。

C++ 异步加载示例

加载 C++ 的工作原理是创建一个委托,其中包含您希望随之传递的一组参数。在下面的示例中,我传入了加载的 Id 和矢量生成位置。

// Get the Asset Manager from anywhere
if (UAssetManager* Manager = UAssetManager::GetIfValid())
{
    // Monster Id taken from a DataTable
    FPrimaryAssetId MonsterId = SelectedMonsterRow->MonsterId;

    // Optional "bundles" like "UI"
    TArray<FName> Bundles;

    // Locations array from omitted part of code (see github)
    FVector SpawnLocation = Locations[0]; 

    // Delegate with parameters we need once the asset had been loaded such as the Id we loaded and the location to spawn at. Will call function 'OnMonsterLoaded' once it's complete.
    FStreamableDelegate Delegate = FStreamableDelegate::CreateUObject(this, &ASGameModeBase::OnMonsterLoaded, MonsterId, SpawnLocation);
    
    // The actual async load request
    Manager->LoadPrimaryAsset(MonsterId, Bundles, Delegate);
}

加载完成后的OnMonsterLoaded函数:

void ASGameModeBase::OnMonsterLoaded(FPrimaryAssetId LoadedId, FVector SpawnLocation)
{
    UAssetManager* Manager = UAssetManager::GetIfValid();
    if (Manager)
    {
        USMonsterData* MonsterData = Cast<USMonsterData>(Manager->GetPrimaryAssetObject(LoadedId));

        if (MonsterData)
        {
            AActor* NewBot = GetWorld()->SpawnActor<AActor>(MonsterData->MonsterClass, SpawnLocation, FRotator::ZeroRotator);
        }
    }
}

示例取自开源 Action Roguelike。

蓝图异步加载示例

在蓝图中异步加载要容易一些,因为有一个整洁的小节点可用。

数据资产和异步加载的资产管理器

蓝图中异步加载的缺点是,我们无法像在上面的示例中那样轻松地在自己的委托中传递其他参数C++在示例中,我们在 FVector 中传递生成位置。加载完成后,您可以从其他引脚传入变量,但我不确定这些变量值是如何“捕获”的,因此应谨慎使用,因为自几帧前启动加载请求以来,它们可能已更改。

资源包

资源包可用于将主资产中的软引用分类为特定类型或用例。例如。游戏内或菜单。有时你只需要加载资产的一小部分(例如,纯粹在UI中查看武器而没有在任何地方渲染网格体时)。您可以使用 meta = (资源包 = “UI”)标记这些变量(可以是您决定的任何名称),并且在异步加载请求期间,您可以指定在未指定捆绑包时仅加载 1 个或多个特定捆绑包而不是整个资源包。

UPROPERTY(…, meta = (AssetBundles = "UI"))
TSoftObjectPtr Icon;

/* Optional Action/Ability assigned to Item. Can be used to grant abilities while this item is active/equipped or to simply run item specific functions */
UPROPERTY(…, meta = (AssetBundles = "Actions"))
TArray> ActionClasses;

/* Optional "Weapon" actor and/or world representation of this object if dropped or equipped by a player */
UPROPERTY(…, meta = (AssetBundles = "Actor"))
TSoftClassPtr ActorClass;

资源管理器配置

配置资源管理器后,它将在添加时自动发现新的主要资产。您可以在“项目设置”>“资源管理器”中设置此配置。

数据资产和异步加载的资产管理器
来自 WARPSQUAD 的示例配置。

可流式处理管理器呢?

Asset Manager 环绕 FStreamableManager,它仍然是可用于非主要资产的管理器。这不是一个完整的替代品,资产管理只是解决一个特定的问题和管理。

审计资产

通过审核资产,您可以更深入地了解如何设置和使用主要资产。

右键单击内容浏览器中的资产可让您“审核资产…”。这使您可以深入了解与资产关联的总大小、使用频率、ID、类型等。使用顶部的按钮可以根据特定条件轻松进行筛选。

数据资产和异步加载的资产管理器
“审核资产”窗口
版权声明:
本站所有文章、资源等一切内容,皆为在本站的注册网友所发布、上传、提供,如您发现任何内容侵犯了您的合法权益, 请与我们联系 ,我们将第一时间进行清理。iiiue.com 旨在为广大虚幻引擎爱好者提供技术交流学习、知识技术变现平台。
永久域名 iii ue .com 本站投稿能赚取收益变现提现,请一定要牢记账号密码!
Ue资源站 iiiue.com » 数据资产和异步加载的资产管理器
广告
也想出现在这里? 联系我们

常见问题FAQ

免费下载或者VIP会员专享资源能否直接商用?
本站所有内容皆为网友发布,资源版权均属于原作者所有,如需商用请联系原作者获取授权许可,若由于商用引起版权纠纷,一切责任均由使用者承担。如您发现某些内容侵犯了您的合法权益, 请与我们联系 ,我们将在第一时间核实并清理。
下载的资源解压密码是多少?
任何资源的解压密码均由发布者提供,一般情况下都在资源的发布页面或者资源文件夹,请仔细检查,如您发现发布页面没有提供解压密码,请您试着在评论处留言联系作者
点击查看解压软件和密码说明
Tips:除了密码说明内的解压密码外,通常情况下,电脑在安装好RAR或360解压缩软件,双击打开压缩包,包内注释的网址也可以试试是否为解压密码哦
资源能否免费获取
本站用户可参与站内的一系列活动获取积分,资源皆可免费获取,若想快速获取可加入本站永久VIP钻石会员,荣耀身份,全站资源免费获取, 点此查看详情

发表回复

广告
也想出现在这里? 联系我们
开通终身VIP 永久VIP折扣活动火热进行中,享全站资源免费下载特权!