2020.12.14情熱開発部プログラム課の今野です!あっという間に12月になってしまいました、皆さんいかがお過ごしでしょうか?今回は、UE4の「EditorUtilityWidget」を使用してActorの置き換えツールを作成していきたいと思います。EditorUtilityWidgetについては前回のブログ担当回にて説明しておりますので是非ご覧ください→https://logicalbeat.jp/blog/5236/Actor置き換えツールとはLevel上に配置されているActorを別クラスのActorに置き換えるツールになります。「レベル上に置かれている○○クラスのActorを別のクラスに変更したいけど、一回一回作り直すのが面倒」といった場合にこのツールは活躍してくれます。実装はC++ではなく全部ブループリントで行っているので結構簡単に作ることが出来ます。実装の流れ実装の流れとしては以下のようになります。1作成した構造体で変数を作り、Actorの情報を入れる関数用意2置き換え処理作成3Group化されているActorをLevel上から探す43で見つけたActorを置き換え5Group化されていないActorをLevel上から探して置き換え6ボタンイベントに処理を記述という流れで実装を進めていきます。事前準備1ツール表示画面作成まず「EditorUtilityWidget」を用意し、このような画面を作成してください。赤枠で囲んでているものは「SingleProperty」というものになります。前回担当したブログにて「SingleProperty」に関して書いておりますのでそちらをご覧ください。「SingleProperty」の初期化を行います。SetPropertyNameにはStaticMeshActorクラス型で作成した変数名を入れてください。この変数には置き換え先のクラス情報が格納されます。作るかというとSpawnActorで置き換え先のクラスでActorを作成するのですが、その際に元のActor情報を作ったActorに渡したいので情報たちをまとめておく為に構造体を作ります。「Actor置き換え開始!」ボタンのイベントを作成します、今回は「OnPressed」イベントを使用します。諸々準備が出来たので早速実装に移りたいと思います。実装では実装の流れに沿って進めていきます。作成し、その変数にActorの情報を入れていきます。保存していたものを置き換え先クラスでSpawnActorしたものに情報を渡しているだけになります。3Group化されているActorをLevel上から探す「GetAllActorsOfClass」を使用してGroupActorクラスを取得します。取得してきたGroupActorを選択状態にします。することでGroupに所属しているActorを一気に取得することが可能です。イメージとしては↓の画像のようなことを疑似的に行っている形になります。処理は以下の通りになります。Group内で置き換えられていないActorが存在する場合だけ置き換え処理を行うようにしています。43で見つかったActorを置き換え1で呼んでいた「ReplaceGroupInActor」関数の実装に進みます。ここでは、Group化を解除→置き換え元情報保存→DestoryActor→置き換え処理という流れになっております。置き換え終わったらGroup化を行う為Actor配列に入れておきます。置き換えが完了したら、「ReplaceGroupInActor」が呼ばれた後にGroup化を行います。5Group化されていない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++を書かなくとも簡単に書けてしまうので、プログラマではない方でも簡単にツールを作れちゃいます。株式会社ロジカルビートは一切の責任を負いません。understrap.com。