ブループリントの作業中にブループリント同士で情報を渡したり共有するためには ブループリント通信 という形式を使います。ニーズに応じて数種類の通信を使い分けることができます。このページでは、最も一般的な方法を説明し、サンプル使用例のリンクを紹介します。
ダイレクト ブループリント通信
アクタの直接通信は、レベル内でアクタ間の情報を共有する方法として最も一般的です。この方法では、作業中のアクタから情報にアクセスするために、ターゲット アクタへの参照が必要です。この通信方法では、作業アクタとターゲット アクタ間で 1 対 1 の関係を使用します。
使用するタイミング
ダイレクト ブループリント通信 を使うケースを紹介します。
レベルに 2 つアクタが存在し、それらをお互いに通信させたい
レベル内のスイッチとインタラクションすることで特定のドアを開いたり、特定のライトを点灯します (それぞれ別のブループリント)。
アクタ間でのブループリント通信の設定方法に関するチュートリアルは「
イベント ディスパッチャー
イベントディスパッチャー はイベントを発行したリッスン中の他のブループリントに指示を出すのに最適です。イベントを発行すると、これらのリッスン中のブループリントが応答し、希望する動作を個々に実行できます。
例えば、キルされた時に "OnDied" イベント ディスパッチャーを呼び出すボスがゲーム内にいたとします。ボスがキルされたという "OnDied" 通知を取得すると実行されるキャラクター (祝う人)、レベル内のドア (開いている)、HUD (UI メッセージで点滅する) など、他のブループリント内で "OnDied" event を バインド できます。
詳細は、「イベント ディスパッチャー」を参照してください。
いつ使用するのか
以下のような場合に、イベントディスパッチャー を使用します。
キャラクター ブループリントから Level ブループリントに通信したい場合
プレイヤー キャラクターがレベルアップし、以前にロックしたエリアを開けたい場合
プレイヤー キャラクターが、レベルで何かを行うアクション ボタンを押した場合
スポーンしたアクタが何かを行った場合にイベントを発行したい場合
ボスをスポーンし、ボスがキルされ、その結果ワールドで報酬がスポーンするときにイベントが発行する場合
レベルでアイテム (武器、ヘルスなど) をスポーンし、ピックアップされた場合にアイテムとキャラクターに通知する場合
ブループリント インターフェース
ブループリント インターフェース (略して インターフェース)では、ある特有の機能性を共有する複数タイプのオブジェクトのインタラクションについて共通のメソッドが可能になります。 例えば、武器で狙撃されてダメージを受けるといったある特定の共通項がある車や木などの全く異なるタイプのオブジェクトを持つことができます。
OnTakeWeaponFire 関数を含む ブループリント インターフェース を作成し、車と木の両方にそのブループリント インターフェースを実装することで、 車と木を同じように扱うことが可能になり、いずれかが撃たれた時に OnTakeWeaponFire 関数を呼び出して、異なる反応をさせることができます。
ブループリント インターフェースは、契約書のようなものだと考えると分かりやすいかもしれません。この契約書は、「このインターフェースを実装すれば、このような特定の関数の実装を約束し、私が呼び出したらそれらに反応する」ことを謳っています。 インターフェースには複数のブループリントを実装できますが、呼び出しの対象のみ反応することができます (その他のものは呼び出しを無視します)。例えば、武器の話に戻ると、壁はダメージに反応してほしくないことでしょう。そのため、OnTakeWeaponFire とのインターフェイスは実装していないので呼び出しを無視します。
詳細については、「ブループリント インターフェースの実装」を参照してください。
いつ使用するのか
以下は ブループリント インターフェース が最善の通信手段となりうるケースです。
似ているが呼び出されると異なって実行する機能が複数のブループリントにある場合。
プレイヤーはフレームスロワー (火災放射器) を持っており、使用すると ElementalDamage というイベントを発行する場合。Snowman ブループリントが雪だるまを溶かす一方で、Tree ブループリントが ElementalDamage を呼び出し木を燃やす場合。
プレイヤーが "use" ボタンを持ち、ボタンを押すとドアが開く、ライトをオフにする、アイテムをピックアップするなどを行う場合。
敵がプレイヤーのヘルスに応じて変化し実行する特殊能力を持つ場合。
ブループリントのキャスティング
ブループリント通信でもう 1 つ共通している形式は、Cast ノードの使用です。Cast ノードを使う場合、オブジェクトに「そのオブジェクトの特別版ですか」、もしそうならアクセスさせてください、そうでないなら私の要求を拒否してくださいと質問するだけです。
例えば、プレイヤー キャラクターがゲーム内を飛ぶことができる Flying Character ブループリントという特別な Character ブループリントを作成したとします。Get Player Character を使ってプレイヤー キャラクターの移動コンポーネントにアクセスし、位置や回転の設定など一般的な方法でプレイヤーに影響を与えることができます。Character ブループリントは飛び方について知らないので、飛ぶ機能へのアクセスはありません。Flying Character ブループリントのみが飛ぶことについて知っています。このインスタンスでは、プレイヤー キャラクターと Cast To Flying ブループリントを取得することにより、飛ぶ関数へのアクセスが確保されます。
プレイヤー キャラクターが Flying Character ブループリントではなくて完全に異なるタイプの Character ブループリントを使用している場合、Flying ブループリントを使っていないので Cast To Flying ブループリントを実行すると失敗し、飛行コマンドへのアクセスおよび実行ができません。
いつ使用するのか
ブループリント キャスティング 使用例をいくつか紹介します。
別のブループリントの特別なバージョンにアクセスしたい場合。
キャラクターが炎の中を歩くとヘルス値を激減させる場合。
特定の Character ブループリントをキャストしてヘルス値にアクセスし変更する場合。
キャラクターが死亡し、リスポーンする必要がある場合。
特定の Game Mode ブループリントをキャストして、リスポーン スクリプトを実行する場合。
同じクラスの複数のブループリントにアクセスして同じ方法で全部変更したい場合。
レベルにいくつか照明があり、イベント発生時に一斉に点灯、消灯したい場合。
Light ブループリントにキャストして、消灯する機能を実行する場合。
特定の子ブループリントにアクセスしたい場合。
Animal ブループリント (Cat、Dog、Bird など) がベースのブループリントが複数あり、そのひとつにアクセスしたい場合。
それぞれのブループリントと固有の機能にアクセスするために Cast to Cat、Cast to Dog、Cast to Bird を使いたい場合。