改訂バージョン: Unreal Engine 4.19 |
皆さんはサブレベルの機能は使っているでしょうか? この機能を使うと、一つの巨大なレベル(Map)に全部を実装するのではなく、いくつかのレベルに分けて実装することができます。また、ActorやAssetのロード/アンロードをコントロールすることもできます。
ただし、この時に一つ厄介な問題があります。Blueprintで別レベルのActorの参照を簡単に取得できない問題です。本来ならそのような参照が必要無い設計にしたいところですが、実際問題そうもいかないことが多いのもまた事実です。ここでは、少し乱暴ですが一番簡単(かな?)な”Get All Actors of Class”と”Tag”を使う方法を解説いたします。
前準備
解説用に新規プロジェクトを次のように作りました。この辺りは自分のプロジェクトに適用する際には作る必要はありません。
レベル構成
Level-Bをサブレベルとして用意。レベルのロードの方法は「Always Loaded」にしてあります。
アクセスしたいBlueprint Actor”BP_A”

Content Browserから”BP_A”というBlueprint Actorを作成後、Blueprintに”Temp Timer”という変数(Public)と、1秒ごとにカウントアップする処理を入れます。上記のようにすると、SetTimer by Function Nameの機能で1秒ごとに”UpdateTime”が呼ばれます。
Componentsでメモ帳のアイコンを追加

レベルに置いた時に何も表示されないと不便なので、メモ帳のアイコンを追加。
“Level-A”にBP_Aを置く

ここからが本題: 全レベルからクラスを指定して参照を取得する
Level-Bに次のようなBPを書くと、読み込まれている全レベルからクラス指定でActorの参照の配列を取得できます。

この状態でZキーを押すと、 現在の経過時間が画面に出力されます。(本来ならちゃんと配列の要素数チェックをかけたほうがいいかも)
タグで任意のActorを特定する
複数同じ型のActorが設置されているとき、特定のActorのみを取得したい時があると思います。(たとえば、大量のSkeletalMeshが置いてあるうちの1体を取得したい、など) そのような時は、ActorにTagを付けて特定します。

Actorには複数のタグを付けることができます。DetailsのActorの項目に隠されているので、ちょっと見つけづらいです。
Blueprintに”Actor Has Tag”という特定のタグを持っているかどうかを調べる機能があるので、以下のように使うと特定の1つを取得することができます。

このように、設置されているレベルにかかわらずActorの参照を取得することができます。よく使う場合はマクロにまとめると便利です。レベル間のコミュニケーション手段は、公式に新機能を策定中らしいので、もう少し待てばもっと簡単な方法が出来るかもしれません。