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

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

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

什么是管理?

中的资源管理器可以让你管理内容,更好地控制加载/卸载,甚至在设置正确时只加载资源的一部分(通过在“主要资源”中使用对这些“次要内容”的软引用,例如武器数据资产中的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,而是可以在 中覆盖资产上的 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、类型等。使用顶部的按钮可以根据特定条件轻松进行筛选。

数据资产和异步加载的资产管理器
“审核资产”窗口
本站声明:
本站所有文章、资源等一切内容,皆为在本站的注册网友所发布、上传、提供,如您发现任何内容侵犯了您的合法权益,请携版权等相关证明致信vamwxyz@gmail.com 与我们联系 ,我们将第一时间进行处理。本站周1-周5每日稳定更新优质资源20+,开通永久SVIP全站资源永久免费!
本站防失联地址,请务必收藏:VAMW.XYZ
VAM » 数据资产和异步加载的资产管理器
广告
也想出现在这里? 联系我们

常见问题FAQ

关于解压密码和游戏资源使用方式的简要说明
本站默认解压密码为发布页网址:vamw.xyz 注意是小写,如果有其他密码也都在资源页面详细说明了,请认真查看,任何资源请下载后解压、切勿在线解压!VAM场景和人物形象资源下载解压缩后,放到VAM游戏目录里的AddonPackages文件夹后重启游戏即可,如D:\VAM\vam1.22.0.3\AddonPackages;更多教程请点击打开
海外用户怎么支付怎么下载?How can overseas users make payments and download?
本站支持“支付宝”、“微信”、“paypal”方式支付,如需“paypal”支付,点击打开Paypal支付;本站所有资源存储于“百度云网盘”,海外用户亦可通过本站教程下载安装注册“百度云网盘”进行资源的下载使用,点击查看教程
Our website supports payments via "Alipay", "WeChat" and "PayPal". If you want to pay with "PayPal", please click Paypal Payment. All the resources on our website are stored in "Baidu Cloud Disk". Overseas users can also download, install and register "Baidu Cloud Disk" according to the tutorials on our website to download and use the resources. Click here to view the tutorials
怎么推广赚钱,怎么免费加入VIP?
高佣金活动进行中:本站开启用户推广赚钱模式,所有用户可以通过文章页或个人中心的的推广链接进行推广赚钱,普通用户推广佣金为15%;永久VIP推广佣金为30%,所有通过你的推广链接注册的用户,在后续发生的所有消费或充值会员的行为,您都有佣金拿!满50可申请提现!普通用户可以在金额达到充值会员金额的时候申请加入会员!赶快行动吧! 点此查看详情

发表回复

广告
也想出现在这里? 联系我们
© 2018 Theme by - VAMW.XYZ 绅士VAM资源站 & All rights reserved 冀ICP备19025219号-2
开通终身VIP 永久VIP折扣活动火热进行中,享全站资源免费下载特权!