情熱開発部プログラム課の今野です!
あっという間に12月になってしまいました、皆さんいかがお過ごしでしょうか?
今回は、UE4の「EditorUtilityWidget」を使用してActorの置き換えツールを作成していきたいと思います。EditorUtilityWidgetについては前回のブログ担当回にて説明しておりますので是非ご覧ください→https://logicalbeat.jp/blog/5236/
Actor置き換えツールとは
Level上に配置されているActorを別クラスのActorに置き換えるツールになります。
例えば、「レベル上に置かれている○○クラスのActorを別のクラスに変更したいけど、一回一回作り直すのが面倒」といった場合にこのツールは活躍してくれます。実装はC++ではなく全部ブループリントで行っているので結構簡単に作ることが出来ます。
実装の流れ
実装の流れとしては以下のようになります。
①作成した構造体で変数を作り、Actorの情報を入れる関数用意
②置き換え処理作成
③Group化されているActorをLevel上から探す
④③で見つけたActorを置き換え
⑤Group化されていないActorをLevel上から探して置き換え
⑥ボタンイベントに処理を記述
という流れで実装を進めていきます。
事前準備
①ツール表示画面作成
まず「EditorUtilityWidget」を用意し、このような画面を作成してください。
赤枠で囲んでているものは「SingleProperty」というものになります。前回担当したブログにて「SingleProperty」に関して書いておりますのでそちらをご覧ください。
「SingleProperty」の初期化を行います。SetPropertyNameにはStaticMeshActorクラス型で作成した変数名を入れてください。この変数には置き換え先のクラス情報が格納されます。
②置き換えを行う際に使用する構造体用意
構造体を用意します。なぜ作るかというとSpawnActorで置き換え先のクラスでActorを作成するのですが、その際に元のActor情報を作ったActorに渡したいので情報たちをまとめておく為に構造体を作ります。
③ボタンイベントを作成
「Actor置き換え開始!」ボタンのイベントを作成します、今回は「OnPressed」イベントを使用します。
諸々準備が出来たので早速実装に移りたいと思います。
実装
では実装の流れに沿って進めていきます。
① 作成した構造体で変数を作り、Actorの情報を入れる関数用意
構造体変数を作成し、その変数にActorの情報を入れていきます。
②置き換え処理作成
構造体変数に保存していたものを置き換え先クラスでSpawnActorしたものに情報を渡しているだけになります。
③Group化されているActorをLevel上から探す
「GetAllActorsOfClass」を使用してGroupActorクラスを取得します。
取得してきたGroupActorを選択状態にします。そうすることでGroupに所属しているActorを一気に取得することが可能です。イメージとしては↓の画像のようなことを疑似的に行っている形になります。
処理は以下の通りになります。Group内で置き換えられていないActorが存在する場合だけ置き換え処理を行うようにしています。
④③で見つかったActorを置き換え
①で呼んでいた「ReplaceGroupInActor」関数の実装に進みます。ここでは、Group化を解除→置き換え元情報保存→DestoryActor→置き換え処理という流れになっております。置き換え終わったらGroup化を行う為Actor配列に入れておきます。
置き換えが完了したら、「ReplaceGroupInActor」が呼ばれた後にGroup化を行います。
⑤Group化されていないActorをLevel上から探して置き換え
「ReplaceNotGroupInActor」関数を作ります、ここではレベル上のStaticMeshActorを継承しているクラスとStaticMeshActorのクラスのActorを「GetAllActorsOfClass」を使用して取得し、置き換えを行います。
この時、Group化されているActorも取得してきてしまうので置き換え先のActorクラスと取得してきたActorクラスで比較して、置き換えされていない場合は置き換えるという処理にしておいてください。
⑥ボタンイベントに処理を記述
作った関数「InitReplaceGroupInActor」「ReplaceNotGroupInActor」を呼びます。
これで実装完了になります!
実装確認
実装完了したのでツールを実行してみましょう。
現状のLevelなります。SphereA、BはGroup化されていて、SphereC、DはGroup化されていない状態です。ツールを実行するとGroup化が崩れずに置き換わるはず・・
それでは、いざ置き換え開始!
StaticMeshActorを継承しているTestActorを作りました。TestActorへ置き換えを行います。
Group化しているActor、Group化されていないActorすべて置き換えることが出来ました!Group化も解除されていません!成功です!
まとめ
今回EditorUtilityWidgetを使ってツールを作ってみました。C++を書かなくとも簡単に書けてしまうので、プログラマではない方でも簡単にツールを作れちゃいます。是非皆さんもEditorUtilityWidgetでツールを作ってみてはいかがでしょうか?ここまで見て頂き有難う御座います。
【免責事項】
本サイトでの情報を利用することによる損害等に対し、
株式会社ロジカルビートは一切の責任を負いません。