BlutilityはActorのカスタムイベントとして作る方が自由度高い
妹「なんて読むの?」
「ブルティリティ……かな。BlueprintUtilityを略した造語だと思うんだけど、とにかくエディタ上でブループリントが実行出来るというもの。詳しい手順は上記のブログがわかりやすい」
妹「エディタ上で実行って、いつも実行してるのでは?」
「プレイボタン押した時のやつとは別で、その前にやるやつ。ConstructionScriptもエディタ上でも実行するけど、その分機能に制約が多い」
「今回やりたいのは、ステージに適当に配置したアセット類を、垂直に落とした地面にくっついた状態にするということ。これは今までだとBeginPlayイベントあたりでやってたこと」
「こういう感じ。本当は落下させるアクターかどうかの区別も必要なんだけど、真下に向けてコリジョン有効(Sweep)で移動させれば、地面に落ちる。これをBlutilityで作ればいい……はずだったんだけど、ここで1回つまづいた」
「GetAllActorOfClassが使えないんだよ。ノードを折りたたんだ状態でコピーするという裏技も試したけど、それだとノードは作れるけどクラッシュする。これがないと配置済みアクタの情報が調べられないし、他に手段がないからどうしようもない」
妹「GetAllActorOfClassが使えないと困るね。っていうか使いみちがあんまりないのでは?」
「そこで色々見て回っていると、こういう動画を見つけた」
「これはGetAllActorOfClass使ってたんだけど、Blutilityの作り方が、GlobalEditorUtilityBaseを使う方法じゃなくて、レベル上に置いた、普通のアクターのカスタムイベントを実行する方式だった。なので同じ方法を試してみた」
「無事落っことすことが出来た。ただちゃんとアクターを区別してないせいで足場も一緒に落ちたりとか問題は残ってるけど、GetAllActorOfClassは無事使仕組みとして問題なさそう」
妹「でもBeginPlayで出来るんだったら、別にエディタでやらなくてもよくない?」
「そのへんは2つ理由がある。まずBeginPlayで色々やるということは、ゲームを実行するたびに時間がかかるわけだから、事前に済むならその方が高速化できる。パソコンだとそんなに時間かからないとしても、スマホやHTML5だと結構効いてくる場合もある」
妹「速くなるのは確かにいいね」
「もう1つはいちいちプレイ押さなくても状態が確認できて、その状態を維持出来ること。いったん落としてから、手動で微調整して、もう一回落下とか、柔軟に編集できる。他にも良いことあるかもしれないけど」
妹「ふんふん、良さそう」
「欠点はアンドゥが効かないってこと。使う前にレベルのセーブが必須。変な風になってたらセーブせずにプロジェクトを閉じて、また開く。この点はちょっと不便だった」