[UE4]Blutilityで配置済StaticMeshActorを置換する

概要

Level内に配置済みのStaticMeshActorが大量にある状態で、それぞれに何らかの機能を付与したいとする。

各Actorについて所望の機能を持つBP Classに置換する際、その置換作業をBlutilityで自動化する。

以下の動画のような結果を得る。

準備

置換先Blueprint

StaticMeshComponentを最低一つ持つ、Actor派生のBPを用意する。

ここでは単純にStaticMeshActorの派生でBPを作り、

キー入力でTransformを制御する機能を付与した。

    • 本記事の画像はクリックで拡大可能

Blutility

Blutilityそのものについては、alwei氏の記事が詳しい。

今回は、ActorActionUtility派生で以下のような関数を持つものを作成した。

Hirofumi Seo氏のツイートを参考にしている。

ConvertStaticMeshClass

選択したActorを、指定したActorに置き換える。

変換元または変換先に指定したActorがStaticMeshComponentを持っていない場合は何も起きない。

    • MeshとMaterialだけコピーしているが、ComponentのPropertyをまとめて複製する手段があればそちらの方がよいだろう。

ReplaceOutlinerTransform

指定Actorの階層とTransformを乗っ取る。

この関数単体で実行可能。

    • Moblityを一時的にMovableにしているのは、変換元のMobilityによっては親子構造を乗っ取れない場合がある為。

    • GetAttachedActorsの戻り値で直接Loopを回すと、インデックスがずれて正しく取得できなくなるので、OrgActorChildren変数に一時保存している。

実行

OutlinerかViewportで変換対象Actorを複数選択し、

右クリック -> Scriped Action -> Convert Static Mesh Class を選択する。

メニューで変換先のClassを指定する。

変換が実行される。

注意事項

GetSupportedClassについて

以下の理由で、このページの例では特に使用していなかった(過去形)。

    • StaticMeshComponentを持たないActorに対して、このScriptは作用しない。

    • 「StaticMeshActor派生ではないがStaticMeshComponentを持つActor」に変換したい場合がある。

Scriptの制限を厳しくしたい場合や、Scripted Actionが増えすぎて困る場合など

Projectの要件に合わせて指定するとよいだろう。

…とか思ってたら、CameraActorを変換してしまったのでやっぱり指定した方がいいだろう。

    • CameraComponentの内部で、シーン表示用のビデオカメラ型Meshを持っている為に変換できてしまう。

ConvertClassの引数型について

単にActorのClass Referenceとしてもよいが、ここをStaticMeshActor型にしておくことで

Script実行時に選択する型を絞ることができる。

Projectの要件に合わせて指定するとよいだろう。

Undo可能

Blutilityによる操作はUndoで実行前に戻すことができるようだ。

動作確認しながら変換していくとよいだろう。

大規模にやる時はバックアップする

変換対象が多いとUE4がEditorごと固まる。

そのままEditorが死んだり、さらにRestoreオプションを実行したりすると、とんでもない状態になる可能性がある。

実行前にセーブしておくほうが良いだろう。

懸念事項

Blutilityの処理はBreakpointで止められないようで、デバッグに若干難儀した。

    • Printノードでデバッグ

    • 処理自体を適当なActor内で記述して、Play中に実行して確認

良い対策があれば@seiko_devまでご教示頂きたい。

関連リンク

以上