一日分の備忘録

ゲーム制作におけるいろいろな実装の備忘録。基本的にはゲームエンジン中心。その中でもUE4がメイン。プログラマーなのでプログラム的な記事が多くなるかも

自作アセットインポートの備忘録。

音ゲー作りたいけどcsvで管理するといろいろ面倒だったのがきっかけで作ってみた。


独自アセットクラスの実装
今回は.txtファイルを読み込みたいのでFString1つだけで良さそう。独自の形式を作りたいときはそれ用に色々変数を作ると良いと思います。
以下のコードを書いた。

.cpp

#include "UTextObject.h"
UTextObject::UTextObject(const FObjectInitializer& ObjectInitializer)
	: Super(ObjectInitializer)
{

}

.h

#pragma once
#include "UTextObject.generated.h"

UCLASS()
class UTextObject : public UObject
{
	GENERATED_UCLASS_BODY()

private:

public:
	UPROPERTY(EditAnywhere)
	FString textData;
};

この時問題になったのが、generated.hがなくてインクルードで怒られるところ。
実際何で解決したのか正確にはわかっていない。
詳しくはまだわかってないので調べてます。
知っている方がいたらtwitterでこっそり教えてください。

GenerateVisualStudioFileをしたら良いっぽい?

次にFactoryクラスを実装。コレはアセットを作成できるようにしたり、インポートしたりをできるようにする感じで作ります。

.cpp

#include "UTextObjectFactory.h"
#include "UTextObject.h"

UTextObjectFactory::UTextObjectFactory(const FObjectInitializer& ObjectInitializer)
	: Super(ObjectInitializer)
{

	SupportedClass = UTextObject::StaticClass();
	bCreateNew = false;
	bEditorImport = true;
	bText = true;
	Formats.Add(TEXT("txt;TextFile"));

}

bool UTextObjectFactory::DoesSupportClass(UClass* Class)
{

	return (Class == UTextObject::StaticClass());

}

UClass* UTextObjectFactory::ResolveSupportedClass()
{

	return UTextObject::StaticClass();

}

UObject* UTextObjectFactory::FactoryCreateNew(
	UClass* InClass,
	UObject* InParent,
	FName InName,
	EObjectFlags Flags,
	UObject* Context,
	FFeedbackContext* Warn)
{
	UTextObject* NewMyAsset =
		CastChecked<UTextObject>(StaticConstructObject_Internal(InClass, InParent, InName, Flags));

	return NewMyAsset;
}

.h

#pragma once
#include "Factories/Factory.h"
#include "UTextObjectFactory.generated.h"

UCLASS()
class UTextObjectFactory : public UFactory
{
	GENERATED_UCLASS_BODY()

	virtual bool DoesSupportClass(UClass* Class) override;
	virtual UClass* ResolveSupportedClass() override;
	virtual UObject* FactoryCreateNew(
		UClass* _Class,
		UObject* _Parent,
		FName _Name,
		EObjectFlags _Flag,
		UObject* _Context,
		FFeedbackContext* _Warn) override;

};

ここまでできたら一旦ビルドして確認。新規作成>その他からTextObjectが作れるようになっているはず。
もしコレをインポートのみにしたい場合はbCreatenewをfalseにすると良い。
Formatsはファイル拡張子;説明と言った感じ。

bText = trueはテキストファイルからのインポートを指定している。コレをtrueにしていない場合は
以下でFactoryCreateText()を実装しているが、そのかわりにFactoryCreateBinary()を実装する必要がある。

Factoryクラスに以下を追加

UObject* UTextObjectFactory::FactoryCreateText(
	UClass* _Class,
	UObject* _Parent,
	FName _Name,
	EObjectFlags Flags,
	UObject* Context,
	const TCHAR* Type,
	const TCHAR*& Buffer,
	const TCHAR* BuferEnd,
	FFeedbackContext* Warn)
{

	FString Values;
	Values = FString(Buffer);

	UTextObject* NewMyAsset =
		CastChecked<UTextObject>(StaticConstructObject_Internal(_Class, _Parent, _Name, Flags));
	
	
	NewMyAsset->textData = Values;

	return NewMyAsset;
}

ここまで作ると、ひとまずtxtファイルがインポートできるはず。

次回はReimportについて書こうかな。