🙆

[UE5][C++] PrimaryDataAssetの作成

2023/05/25に公開

概要

PrimaryAssetDataは自分で読み込みするデータセットを作ることができます。
今回はスケルタルメッシュとABPを読み込みするためのPrimaryDataAssetを作成します。

前提条件

この前提条件を満たしていないとできないということではありませんが、
AssetManagerのカスタムクラス作成記事を進めてから、
こちらを進めると実装しやすいかと思います。
https://zenn.dev/hakuto_gamedev/articles/3d1da6aa0c7fe0

PrimaryAssetDataクラスを追加


毎度おなじみのエディタからC++クラス追加です。

▼MyPrimaryDataAsset.h
UCLASS()
class TEST_API UMyPrimaryDataAsset : public UPrimaryDataAsset
{
	GENERATED_UCLASS_BODY()
	

public:

	/**
	*	@brief	プライマリアセットID名を取得
	*/
	UFUNCTION(BlueprintCallable)
	FString GetIdentifierString() const;


	/**
	*	@brief	プライマリアセットIDを取得
	*/
	virtual FPrimaryAssetId GetPrimaryAssetId() const override;


	// アイテムタイプ
	UPROPERTY(VisibleAnywhere, BlueprintReadOnly)
	FPrimaryAssetType ItemType;

};
▼MyPrimaryDataAsset.cpp
/******************************************************************************
*	@brief	プライマリアセットID名を取得
*******************************************************************************/
FString UMyPrimaryDataAsset::GetIdentifierString() const
{
	return GetPrimaryAssetId().ToString();
}






/******************************************************************************
*	@brief	プライマリアセットIDを取得
*******************************************************************************/
FPrimaryAssetId UMyPrimaryDataAsset::GetPrimaryAssetId() const
{
	return FPrimaryAssetId(ItemType, GetFName());
}

最低限構成での実装は上記のようになります。
見ての通りですが、スケルタルメッシュやABPの変数は実装していません。
これはあくまでPrimaryDataAssetのベースクラスになります。

Editor上でアセット化するPrimaryDataAssetクラスを実装する

スケルタルメッシュとABPを追加したPrimaryDataAssetを作ります。

UCLASS(Blueprintable)
class TEST_API UCharacterDataItem : public UMyPrimaryDataAsset
{
	GENERATED_BODY()

public:
	//ItemTypeを設定する
	UCharacterDataItem() 
	{
		ItemType = UMyAssetManager::CharacterDataItemType;
	}

	
	//スケルタルメッシュ
	UPROPERTY(EditAnywhere, BlueprintReadOnly)
	class USkeletalMesh* CharacterMesh;

	//ABP
	UPROPERTY(EditAnywhere, BlueprintReadOnly)
	TSubclassOf<class UAnimInstance> AnimInstance;

};

スケルタルメッシュとABPクラスを格納する変数を追加しています。

「UMyAssetManager::CharacterDataItemType」
こちらの変数はAssetManagerに以下のように定義しています。

▼UMyAssetManager.h

static const FPrimaryAssetType CharacterDataItemType;

▼UMyAssetManager.cpp

#include "MyAssetManager.h"


const FPrimaryAssetType UMyAssetManager::CharacterDataItemType = TEXT("CharacterDataItem");


UMyAssetManager& UMyAssetManager::GetAssetManager()
{
	UMyAssetManager* AssetManager = Cast< UMyAssetManager>(GEngine->AssetManager);
	if (AssetManager)
	{
		return *AssetManager;
	}
	else
	{
		return (*NewObject<UMyAssetManager>());
	}
}

このItemTypeはクラスによって、1つ用意するのが基本となります。

UE4Editor上でプライマリアセットを作成・設定する

UE4Editor上で、プライマリアセットを作成します。

  1. データアセットを選択します。
    ※/Game/Items/PA_CharacterDataになるように、アセットを配置しています。

  2. CharacterDataItemを選択します。

  3. スケルタルメッシュとABPクラスを設定します。

  4. 最後に、AssetManagerの設定をする

  • PrimaryAssetTypeを設定する
  • AssetBaseClassを設定する
  • Directoriesにアセットパスを記載します。

作成したプライマリアセットをロードする

テストとしてレベルブループリントに、ロード処理を記載しています。

AsyncLoadPrimaryAssetを使ってロード処理を行います。
他にもリストを渡してロードするタイプなど、関数がいくつかあります。

まとめ

ざっくりとした説明ですが、以上です。
開発では同期ロードと非同期ロードをうまく使い分けて、
なるべくロード時間によるストレスが軽減されるようにします。
非同期ロードは、プライマリアセットが使いやすくておすすめです。

今回はSkeletalMeshなどシンプルなデータでしたが、
構造体を取り扱う場合、デフォルトでは構造体内のアセット読み込みができないため、
そこだけ注意必要かと思います。

Discussion