関連ブログ
- [UE4][UE5]開発環境の容量を少しでも減らす 2024.08.14UE
- [UE5] PushModel型のReplicationを使い、ネットワーク最適化を図る 2024.05.29UE
- [UE5]マテリアルでメッシュをスケールする方法 2024.01.17UE
CATEGORY
2015.01.20UE4UE/ C++
改訂バージョン: Unreal Engine 4.21 |
前回の記事では、独自のアセットを実装し、ContentBrowser上から作成する方法をご紹介しました。
今回はその続きで、外部ファイルをインポートしてアセットを作成する方法をご紹介したいと思います。
今回のサンプルでは、”.myasset”という拡張子のカンマ区切りテキストファイルから、3つの整数を ValueA, ValueB, ValueC プロパティに対して読み込む、ということにしたいと思います。
まずはインポートするファイルを用意します。
1 |
1,22,333 |
前回のコードを、下記のように書き換えます。変更の無い箇所は省略しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
#pragma once #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; }; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
#include "MyAssetFactory.h" #include "Blog_MyAsset.h" #include "MyAsset.h" 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) 独自のシリアライズを実装する