[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までご教示頂きたい。
関連リンク
以上