BLOGブログ

2018.12.12UE4UE/ C++

[UE4] レベルエディタの配置ツールに独自の項目とアセットを追加する方法

執筆バージョン: Unreal Engine 4.21

レベルエディタにある配置ツールは以下の画像のように

Basic/Lights/Volumesなどの項目に別れ、目的のアクターを用意に発見し、配置することができるようになっています。 ところが自前で作成したアセットなどは、これらの項目に振り分けられず、RecentlyPlaced(最近配置したもの)かAll Classes(すべてのクラス)からしかアクセスすることができません。   今回の記事はここに独自の項目とアセットを追加する方法をご紹介します。 ※今回の記事はC++とPluginを使用します。  

登録するアクターの作成

※すでに用意されているクラスを登録したい場合はこの後は必要ありません。 まずは配置ツールに追加したいクラスを作成します。 エディタの「ファイル->新規C++クラス…」などから新規のC++を作成します。 作成するクラスはAActorの派生クラスである必要があります。(直接の子クラスでなくて構いません) 今回はMyActorというクラスを作成しました。プロジェクト名はtest421codeです。

項目を追加するためのプラグイン作成

ここの項目を追加できるタイミングが限られているため、項目の追加を行うプラグインを作成します。 エディタからは「編集->Plugins」からプラグイン一覧のウィンドウを出し、右下の「New Plugin」を押すと新規プラグインの作成ウィンドウが出るので、 Blancのテンプレートを選択肢て名前を設定し、Create Pluginで作成します。

プラグインが作成できたら、プラグイン名.upluginファイルを開き、ModulesのTypeを”Runtime”から”Editor”にLoadingPhaseを”Default”から”PostEngineInit”に変更します。 次にプラグイン名.Build.csのPublicDependencyModuleNamesには登録したいクラスを作成した先のModule名とエディタの機能を使うので”UnrealEd”を記述します。 今回はプロジェクト側にMyActorというクラスを作成したのでプロジェクト名であるtest421codeを記述しました。

最後にプラグイン名.cppを開き項目の追加コードを記述します。

これで配置ツールに登録されました。

 

続いてコードの解説です。

まずは必要なクラスをincludeします。 次にStartupModuleでこのプラグインの初期化時にメニューに項目を追加します。 IPlacementModeModule::Get().RegisterPlacementCategory(Info);で登録し、登録する際の項目名や何番目に項目を表示するかなどはFPlacementCategoryInfoで定義します。 そして項目にアセットを登録するには IPlacementModeModule::Get().RegisterPlaceableItem()を使用します。 ShutdownModuleの中ではUnregisterPlacementCategoryで追加した項目を削除するコードを記述しています。 コード内に出てくるPriorityは上から何番目に項目を追加するかの指定に使用します。ただし第5引数にfalseを指定すると常に一番上や一番下など定位置に配置できます。 デフォルトで用意されている項目のPriorityは以下のとおりです。

項目名 Priority
Recently Placed 常に上
Basic 10
Lights 20
Cinematic 25
Visual Effects 30
Geometry 35
Volumes 40
All Classes 50

今回は45に設定していたのでVolumesとAll Classesの間に項目が作られました。 なお、すでにあるものと同値にすると基本的にはこのプラグインで追加したものがあとに来るようですが、同Priority内での順序はModuleのロード順になるためほぼ不定となりそうです。