関連ブログ
- [UE4][UE5]開発環境の容量を少しでも減らす 2024.08.14UE
- [UE5] PushModel型のReplicationを使い、ネットワーク最適化を図る 2024.05.29UE
- [UE5]マテリアルでメッシュをスケールする方法 2024.01.17UE
CATEGORY
2014.06.01UE4UE/ Blueprint
改訂バージョン: Unreal Engine 4.19 |
皆さんはサブレベルの機能は使っているでしょうか? この機能を使うと、一つの巨大なレベル(Map)に全部を実装するのではなく、いくつかのレベルに分けて実装することができます。また、ActorやAssetのロード/アンロードをコントロールすることもできます。
ただし、この時に一つ厄介な問題があります。Blueprintで別レベルのActorの参照を簡単に取得できない問題です。本来ならそのような参照が必要無い設計にしたいところですが、実際問題そうもいかないことが多いのもまた事実です。ここでは、少し乱暴ですが一番簡単(かな?)な”Get All Actors of Class”と”Tag”を使う方法を解説いたします。
解説用に新規プロジェクトを次のように作りました。この辺りは自分のプロジェクトに適用する際には作る必要はありません。
Level-Bをサブレベルとして用意。レベルのロードの方法は「Always Loaded」にしてあります。
Content Browserから”BP_A”というBlueprint Actorを作成後、Blueprintに”Temp Timer”という変数(Public)と、1秒ごとにカウントアップする処理を入れます。上記のようにすると、SetTimer by Function Nameの機能で1秒ごとに”UpdateTime”が呼ばれます。
レベルに置いた時に何も表示されないと不便なので、メモ帳のアイコンを追加。
Level-Bに次のようなBPを書くと、読み込まれている全レベルからクラス指定でActorの参照の配列を取得できます。
この状態でZキーを押すと、 現在の経過時間が画面に出力されます。(本来ならちゃんと配列の要素数チェックをかけたほうがいいかも)
複数同じ型のActorが設置されているとき、特定のActorのみを取得したい時があると思います。(たとえば、大量のSkeletalMeshが置いてあるうちの1体を取得したい、など) そのような時は、ActorにTagを付けて特定します。
Actorには複数のタグを付けることができます。DetailsのActorの項目に隠されているので、ちょっと見つけづらいです。
Blueprintに”Actor Has Tag”という特定のタグを持っているかどうかを調べる機能があるので、以下のように使うと特定の1つを取得することができます。
このように、設置されているレベルにかかわらずActorの参照を取得することができます。よく使う場合はマクロにまとめると便利です。レベル間のコミュニケーション手段は、公式に新機能を策定中らしいので、もう少し待てばもっと簡単な方法が出来るかもしれません。