BLOGブログ

2018.09.14UE4/Blueprint

[UE4] 複数のレベルに配置しているアクターの中身を一括で調べる機能の紹介

 

執筆バージョン: Unreal Engine 4.20

今回はBlutilityの具体的な使用例を紹介したいと思います。

まずはじめにBlutilityの事がよくわからない、知らないという方は弊社ブログだったり様々な方が機能を紹介しているのでそちらを見て頂くのが早いと思います。

簡単に一言で説明すると、通常のBlueprintがゲーム中に実行される機能に対し、Blutilityはエディタ上で実行することができる機能と思ってもらえれば大丈夫です。

うまく使いこなす事ができれば、大量の単純作業をボタン一つでおこなえ、作業の効率化を図る事ができます。

機能説明系リンク

■alwei様のブログ
UE4 Blutilityによるお手軽なエディター拡張
Blutilityがどんな機能なのかを紹介しています

■MozPaca様のブログ
UE4 4.20 BlutilityとEditor Scriptingを試してみる その1
UE4 4.20 BlutilityとEditor Scriptingを試してみる その2
UE4 4.20 BlutilityとEditor Scriptingを試してみる その3
Blutilityの機能を紹介しつつ、選択したメッシュにコリジョンをつける機能を作例として挙げられています

作例系リンク

■弊社ブログ
[UE4]”OpenAsset”を使ってみよう
指定したスケルタルメッシュ内に含まれる全てのマテリアルを開く(マテリアルエディタを開く)機能を作例として挙げています

■株式会社アンナプルナ様のブログ
【UE4】プランナーがBlutilityでジェネレータを作ってみた
指定した範囲内にランダムに木や草などを配置する機能を作例として挙げられています

■株式会社アンナプルナ様のブログ
【UE4】プランナーがBlutilityで仕事を効率化してみた-その1-(Level編)
新規で複数のレベルを作成して、作成したレベル内にそれぞれ自動で指定のアクターを配置する機能を作例として挙げられています

■T_Sumisaki様の記事
BlutilityでStaticMeshのMaterialを一括置換するコマンドを作る
指定したスタティックメッシュのマテリアルを一括置換する機能を作例として挙げられています

 

目的

さて、今回作るのはサブレベルに配置しているアクターにどんな値が入っているのかを一括で知る方法です。

といっても、それだけだとゲーム実行中でもGetAllActors系の関数を使えば簡単にログに出せるので、わざわざBlutilityを使う必要はありません。今回Blutilityを使う強みは、ゲーム全体で使用しているアクターを簡単に調査できる点です。

具体的に言うと、例えばRPGを作る際に1つのダンジョンに宝箱がいくつあって、その中身が何かを知るのはBlueprintでも作れますが、そのためにはわわざわざそのダンジョンのレベルを開いて実行する必要があります。
そこで今から紹介する機能を使えば、全てのダンジョンでそれぞれ宝箱がいくつあって何が入っているかを一括でログ出力する事が可能になります。

この機能は開発後期にゲームバランスを調整したい場合や、デバッグで宝箱などの中身のパラメーターが想定通りになっているかをチェックしたい場合に大変便利かと思います。とくにダンジョンの数(レベルの数)が多ければ多いほど、こういった機能がとくに有効ではないでしょうか。

 

作成方法

それでは機能の作り方です。

その前にエディタの設定でBlutilityの機能を有効にしておいて下さい。方法は省略しますので、上記リンク集を参照して下さい。


今回はアクターに対する操作を行うので、基底クラスはActorActionUtilityを選択します。


BlueprintEditorを開くのはBlueprintと違って右クリックな事に注意して下さい。Blutilityのダブルクリックは実行のための操作と覚えておくとよいでしょう。


Blueprintと同じようにイベントをAddCustomEventを使って追加します。とりあえず今回はイベント名を「GetParameter」にしておきますが、イベント名は機能がわかるような名前にするとよいでしょう。
エディタ上からこのイベントが呼べるようにCallInEditorをOnにしておきます。

※ちなみにUE4.20.2の時点ではBlutilityをダブルクリックで実行できるようになるAutoRunDefaultActionを使用してレベル操作を行おうとするとエディタがクラッシュするようです。なので今回は「EventOnDefaultClicked」は使わないでおきます。


それではイベントの中身を書いていきましょう。
GetAssetsByPathで指定したフォルダ以下の全アセットを取得できます。RecursiveをOnにすると子のフォルダも全て対象になるのでOnにしておきます。
また、今回はやっていませんがフォルダの指定を変数にすれば、指定するフォルダを変更する場合にわざわざBlutilityを編集しなくてもよくなるでしょう。
そしてアセットを取得したらForEachLoopで回します。
次に1つずつレベルアセットかどうかをチェックして、レベルだった場合はLoadMapを使ってレベルを開きます。
ちなみにレベルはWorldクラスなので、GetClassを使ってWorldかどうかをチェックしています。もしこのチェックをせずにレベル以外をLoadMapで開こうとするとエディタがクラッシュするので注意して下さい。


LoadMap後の続きです。
GetAllActorsOfClassで指定した全アクターを取得します。
あとForEachLoopを使って、アクターの中身で知りたいプロパティをGetしてきてPrintStringなどでログに吐き出せば完了です。
この部分を改造すれば、色んなパラメーターを一括で取得できるようになるわけです。


最後に実行方法です。作成したBlutilityをダブルクリックで開き、先程作成したイベント名のボタンが表示されるので、それをクリックすれば完了です。

ちなみに出力したログは「プロジェクトフォルダ\Saved\Logs」にLogファイルとして吐き出されます。テキスト形式なので、正規表現などを駆使して必要な情報だけを取り出し、エクセルなどに貼り付ければ一覧表としても使えて完璧じゃないでしょうか。

いかがでしたでしょうか?
Blutilityは色々な方の記事や今回の記事から、開発中期の量産期だったり、開発後期のデバッグ期にこそパワーを発揮できるという事がご理解いただけたかと思います。
みなさんもBlutilityを活用し、効率良いゲーム開発を目指していきましょう!