⛄️
【UE5】C++で作成したDataAssetに対して値を設定した状態で保存する
概要
データアセットをC++で生成して、それをあらかじめ値を設定した状態でコンテンツブラウザ上に保存したいときがありました。
イメージとしては下記ツイートを想定してます。
設定項目自体は少ないのですが、物量が多くてBP上でポチポチ設定するのは大変だなと思い、プログラムで生成できたら早そうだなと思ったからです。
今回はそのために試したことについて記事にしました。
参考になれば幸いです。
環境
UE5.4.4
やり方
- データアセットを用意する
- 用意したデータアセットを生成して値を設定する処理を用意する
データアセットを用意する
今回は説明のため最小構成のデータアセットを用意します。
UExampleDataAsset.h
#pragma once
#include "CoreMinimal.h"
#include "Engine/DataAsset.h"
#include "UExampleDataAsset.generated.h"
UCLASS(Blueprintable)
class UExampleDataAsset : public UPrimaryDataAsset
{
GENERATED_BODY()
public:
UPROPERTY(EditAnywhere,Blueprintable)
FString ExampleText;
};
データアセットを生成して値を設定する処理を用意する
今回はBlueprintFunctionLibraryで下記の処理を用意しました
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "ExampleBlueprintFunctionLibrary.generated.h"
UCLASS()
class UExampleBlueprintFunctionLibrary : public UBlueprintFunctionLibrary
{
GENERATED_BODY()
public:
UFUNCTION(BlueprintCallable)
static void CreateExampleDataAsset();
};
ExampleBlueprintFunctionLibrary.cpp
void UExampleBlueprintFunctionLibrary::CreateExampleDataAsset()
{
//データアセットを生成するためのFactoryを生成
UDataAssetFactory* Factory = NewObject<UDataAssetFactory>(UDataAssetFactory::StaticClass());
Factory->DataAssetClass = UExampleDataAsset::StaticClass(); //先程作成したDataAssetを指定する
//データアセットの生成
IAssetTools& AssetTool = FModuleManager::LoadModuleChecked<FAssetToolsModule>("AssetTools").Get();
UObject* DataAsset = AssetTool.CreateAsset(
"ExampleDataAssetFromCpp", //保存するアセット名(拡張子はいらない)
"/Game/", //Gameフォルダ直下に作成する
UPrimaryDataAsset::StaticClass(), //PrimaryDataAssetとして生成する
Factory
);
//そのままだとUExampleDataAssetとして使えないのでキャストする
UExampleDataAsset* ExampleDataAsset = Cast<UExampleDataAsset>(DataAsset);
if(ExampleDataAsset)
{
ExampleDataAsset->ExampleText = FString("Example");
//設定の変更を適応させる。これを行わないと編集中状態になるためわざわざ保存しないといけない手間が増えるためSaveさせる
UPackage* Package = ExampleDataAsset->GetPackage();
FSavePackageArgs SaveArgs = FSavePackageArgs();
SaveArgs.SaveFlags = RF_Public | RF_Standalone;
UPackage::Save(Package,DataAsset,*FPackageName::LongPackageNameToFilename(Package->GetFName().ToString(), FPackageName::GetAssetPackageExtension()),SaveArgs);
}
}
結果
上記関数を呼んで、このようなGameフォルダ直下にExampleDataAsset
ができていて、このようにExample文字が設定されていれば成功です。
Discussion