ぼっちプログラマのメモ

UE4とかVRとかについて書いたり書かなかったり。

UE4のアセットに説明文・タグなどを追加するエディタ拡張について

はじめに

突然ですが、先日開かれたUE4マテリアル管理勉強会(#UE4DD)のスライドに
こんなページがありました。

f:id:pafuhana1213:20170123222157p:plain
f:id:pafuhana1213:20170123222121p:plain
f:id:pafuhana1213:20170123222034p:plain

説明文を記述できるように拡張!
タグ付けの機能を追加!

なにそれ超便利!

ということで、早速やってみましょう!
エンジンのコードを弄る必要はありますが、凄く簡単です!

…あ、UE4マテリアル管理勉強会のスライドはこちらです。
超有益な情報の塊なので読むことを超おすすめします!
マテリアルとマテリアルインスタンスの仕組みと問題点の共有 (Epic Games Japan: 篠山範明) #UE4DD
マジシャンズデッド ポストモーテム ~マテリアル編~ (株式会社Byking: 鈴木孝司様、成相真治様) #UE4DD
大規模タイトルにおけるエフェクトマテリアル運用 (SQEX大阪: 林武尊様) #UE4DD

アセットに説明文を追加

細かい話はとりあえず置いておいて、
まずは実際にアセットに説明文を記述できるようにしてみましょう。
今回はマテリアルアセットを対象としますが、基本的に他のアセットでも応用可能です。

Material.hに以下の記述を追加します。

UCLASS(hidecategories=Object, MinimalAPI, BlueprintType)
class UMaterial : public UMaterialInterface
{
	GENERATED_UCLASS_BODY()

// ここから
#if WITH_EDITORONLY_DATA

	UPROPERTY(EditAnywhere, Category = TEST)
	FName Description;
#endif
// ここまで!

.
.
.

追加後に、UE4プロジェクトをDevelopment Editorでビルドします。
そして、てきとうなMaterialアセットを開いてみると…

f:id:pafuhana1213:20170124004229p:plain

Descriptionという項目が追加されています!
さらに、この項目に入力した文字がポップアップに表示されるようになりました!
f:id:pafuhana1213:20170124004341p:plain

さらにさらに、検索も可能になっています!
f:id:pafuhana1213:20170124004513p:plain

予想以上に簡単でびっくりですね!

アセットにタグを追加

次はタグを追加してみましょう!
今回は、はじめのスライドのようにプルダウンリスト形式にします。

まず先程と同じようにMaterial.hに以下の記述を追加します。

.
.
.
	MDR_Normal UMETA(DisplayName="Normal"),
	/** Receive Decals, applies all DBuffer channels, assumes the decal is non metal and mask the subsurface scattering. */
	MDR_NormalRoughness UMETA(DisplayName="Normal Roughness"),
	/** Receive Decals, applies all DBuffer channels, assumes the decal is non metal and mask the subsurface scattering. */
	MDR_Roughness UMETA(DisplayName="Roughness"),
	MDR_MAX
};

// ここから
#if WITH_EDITORONLY_DATA

UENUM()
enum ETestTag
{
	ETT_Okazu UMETA(DisplayName = "Okazu"),
	ETT_Yamada UMETA(DisplayName = "Yamada"),

	ETT_MAX,
};

#endif
// ここまで!
.
.
.
UCLASS(hidecategories=Object, MinimalAPI, BlueprintType)
class UMaterial : public UMaterialInterface
{
	GENERATED_UCLASS_BODY()

#if WITH_EDITORONLY_DATA
	UPROPERTY(EditAnywhere, Category = TEST, AssetRegistrySearchable)
	FName Description;

// ここから
	UPROPERTY(EditAnywhere, Category = TEST, AssetRegistrySearchable)
	TEnumAsByte<enum ETestTag> TestTag;
// ここまで!
#endif
.
.
.


次に、同じくビルドしてエディタ起動→マテリアルを開いてみます。
f:id:pafuhana1213:20170124005240p:plain

タグを入力できるようになりました!
もちろん、ポップアップ・検索にも対応できています。
f:id:pafuhana1213:20170124005338p:plain


この2つの方法を組み合わせることで、
プロジェクトに適したアセット管理が可能になるかと思います!

補足

今回やった内容は、普段Unreal C++を触っている方なら皆知っている
UPROPERTYを使っただけだったりします。
ですので、プロパティ指定子を使うことでカスタマイズ可能です。
今回のサンプルでは "EditAnyWhere" "Category"
"AssetRegistrySearchable”
を使用しています。
Unreal Engine | Properties
UPROPERTY - Epic Wiki

"EditAnyWhere"については、素晴らしい比較記事があったのでそちらをどうぞ
qiita.com

"Category"は、その名の通り項目のカテゴリを設定します。
実際にアセットの詳細パネルに表示されるカテゴリの順番は、
コード内で"Category"が使用された位置に依存します。

例えば、今回の追加コードはUMaterialの中で最も早くCategoryを使用しているので、
詳細パネルの最も上にTESTカテゴリが位置しています。

"AssetRegistrySearchable"は、その項目をポップアップ・検索に追加します。
ポップアップ・検索に含めたくない場合は使用しないようにしましょう。


UPROPERTYがどのような仕組みで扱われているかが気になる方は、
こちらの記事がオススメです。
Unreal Property System (Reflection)

最後に

はじめのスライドにもありましたが、
アセット管理はプロジェクトの規模が増えるにつれてトラブルの原因になりがちです。
今回説明したようなエディタ拡張を使うことで、そのトラブルを回避していきましょう!

次回は、MaterialのStatic Switch Parameter事故防止対策編の予定

書きました
pafuhana1213.hatenablog.com