BLOGブログ

2015.01.20UE4UE/ C++

[UE4] 独自のアセットを実装する方法(2) インポートの実装

改訂バージョン: Unreal Engine 4.21

前回の記事では、独自のアセットを実装し、ContentBrowser上から作成する方法をご紹介しました。

今回はその続きで、外部ファイルをインポートしてアセットを作成する方法をご紹介したいと思います。

 

1.準備

今回のサンプルでは、”.myasset”という拡張子のカンマ区切りテキストファイルから、3つの整数を ValueA, ValueB, ValueC プロパティに対して読み込む、ということにしたいと思います。

まずはインポートするファイルを用意します。

2.Factoryをインポートに対応する

前回のコードを、下記のように書き換えます。変更の無い箇所は省略しています。

#include “CoreMinimal.h”
#include “Factories/Factory.h”
#include “MyAssetFactory.generated.h”

/**
*
*/
UCLASS()
class BLOG_MYASSET_API UMyAssetFactory : public UFactory
{
GENERATED_UCLASS_BODY()
//中略
virtual UObject* FactoryCreateText(
UClass* InClass,
UObject* InParent,
FName InName,
EObjectFlags Flags,
UObject* Context,
const TCHAR* Type,
const TCHAR*& Buffer,
const TCHAR* BuferEnd,
FFeedbackContext* Warn
) override;
};

UMyAssetFactory::UMyAssetFactory(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
SupportedClass = UMyAsset::StaticClass();
bCreateNew = false;
bEditorImport = true;
bText = true;
Formats.Add(TEXT(“myasset;My Asset”));
}

UObject* UMyAssetFactory::FactoryCreateText(
UClass* InClass,
UObject* InParent,
FName InName,
EObjectFlags Flags,
UObject* Context,
const TCHAR* Type,
const TCHAR*& Buffer,
const TCHAR* BuferEnd, FFeedbackContext* Warn
)
{
TArray Values;
FString(Buffer).ParseIntoArray(Values, TEXT(“,”), true);

UMyAsset* NewMyAsset =
CastChecked(StaticConstructObject_Internal(InClass, InParent, InName, Flags));
if (NewMyAsset && (3 <= Values.Num())) { NewMyAsset->ValueA = FCString::Atoi(*Values[0]);
NewMyAsset->ValueB = FCString::Atoi(*Values[1]);
NewMyAsset->ValueC = FCString::Atoi(*Values[2]);
}

return NewMyAsset;
}

コンストラクタで、bCreateNew=false; bEditorImport=true; とすることで、インポートでのアセット作成に対応します。

(理由は不明ですが、1つのUFactoryで新規作成とインポートの両立は出来ないみたいです。UFactory::StaticImportObject()の実装を参照)

また、bText=true;とすることで、テキストファイルからのインポートを指定します。

bText=false;とした場合は、FactoryCreateText()ではなく、FactoryCreateBinary()を実装する必要があります。

 

Formatsに文字列を追加し、ファイルの拡張子と説明文を指定します。

 

新規作成は FactoryCreateNew()で実装しましたが、テキストファイルからのインポートは FactoryCreateText()で実装します。

引数Buffer~BufferEndで示される領域に、ファイルから読み込んだ文字列が格納されています。

こちらを文字列処理でパースして、作成した NewMyAsset のメンバに値を反映します。

 

これで、最初に用意した ImportSample.myasset を ContentBrowser にドラッグ&ドロップすることで、ファイルのインポートが実現します。

インポートして作成されたアセットをダブルクリックして、ValueA, ValueB, ValueC に値が格納されていることを確認してみて下さい。

[UE4] 独自のアセットを実装する方法(1) アセットクラスの実装
[UE4] 独自のアセットを実装する方法(2) インポートの実装

[UE4] 独自のアセットを実装する方法(3) 再インポートの実装

[UE4] 独自のアセットを実装する方法(4) アセットにアクションを追加する

[UE4] 独自のアセットを実装する方法(5) アセットエディタを実装する

[UE4] 独自のアセットを実装する方法(6) 独自のシリアライズを実装する