⛄️

【UE5】C++で作成したDataAssetに対して値を設定した状態で保存する

2024/10/30に公開

概要

データアセットをC++で生成して、それをあらかじめ値を設定した状態でコンテンツブラウザ上に保存したいときがありました。

イメージとしては下記ツイートを想定してます。
https://x.com/daria_nicht/status/1850930505245720614

設定項目自体は少ないのですが、物量が多くてBP上でポチポチ設定するのは大変だなと思い、プログラムで生成できたら早そうだなと思ったからです。
今回はそのために試したことについて記事にしました。

参考になれば幸いです。

環境

UE5.4.4

やり方

  1. データアセットを用意する
  2. 用意したデータアセットを生成して値を設定する処理を用意する

データアセットを用意する

今回は説明のため最小構成のデータアセットを用意します。

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文字が設定されていれば成功です。

参考

UE4 C++からアセットを作る

UObject Instance Creation

UnrealC++で画像ファイルからテクスチャアセットを作成する

Discussion