このページでは、ブループリント通信 のセットアップおよび使用方法について段階的に学習します。
ダイレクト ブループリント通信
下の画像のように、2 つの ブループリント を互いに通信させようとします。Cube ブループリントを Sparks ブループリントと通信させ、プレイヤー キャラクターがキューブに入ったときに Sparks ブループリントをオフにしたい場合、ダイレクト ブループリント通信 を使用して簡単に行うことができます。
- この画像のキューブは、Shape_Cube メッシュを使用して作成した ブループリント で、コリジョンがトリガーとして機能するように OverlapOnlyPawn に設定されています。** Overlap と Generate Overlap Events
- 上の画像の火花は Blueprint_Effect_Sparks アセットです (スターター コンテンツにあります)。
ダイレクト ブループリント通信を使用して以下を行います。
-
Shape_Cube ブループリントで、My Blueprint にある変数カテゴリ: の ボタンをクリックします。
-
[Details (詳細)] パネルの Variable Type で、アクセスするブループリントのタイプを選択します。
Blueprint_Effects_Sparks 変数タイプにカーソルを当て、リストから [Reference] を選択します。
ここでは、Blueprint_Effect_Sparks ブループリントにアクセスすることを示しています。
-
[Details (詳細)] パネルで、以下のセクションを更新します。
- Variable Name (変数名) - 「TargetBlueprint」 などの説明的な変数名を付けます。
- Variable Type (変数タイプ) - アクセスするブループリントのタイプです。
- Editable (編集可能) - レベル エディタで利用できるように、変数を公開する場合は必ずチェックをいれるようにします。
- Tool Tip (ツールチップ) - 変数が何を行うか、何を参照するかについて簡単な説明を追加します。
-
レベルで Shape_Cube ブループリントを選択すると、レベル エディタの [Details (詳細)] の中に、前の手順で作成して公開した変数があります。
- None ドロップダウン ボックスをクリックして、Target Blueprint を割り当てます。
- レベルに配置されたブループリントのインスタンスが全てここに表示され、Target Blueprint にするインスタンスを指定できます。
ここでは、レベルに配置されている影響を与えたい Blueprint_Effect_Sparks Blueprint アクタを表します。これは、Instance アクタと考えられます。レベルで複数の火花を生じ、ひとつだけをオフにしたい場合、Target Blueprint として設定することで影響を与えたいブループリントのインスタンスを選択できます。
-
ドロップダウンを使用する代わりに、 アイコンをクリックすることができます。次にレベルに配置されているオブジェクトで参照したいものをクリックします。
指定した 変数タイプ (この例では Blueprint_Effect_Sparks) をターゲットにするために、Target Blueprint のみを設定することもできます。
-
Shape_Cube ブループリントで、Ctrl キーを押しながら、変数をグラフにドラッグします。
- これで、Target Blueprint からイベント、変数、関数などにアクセスできる "getter" ノードが作成されます。
- 出力ピンをドラッグして、コンテキスト メニューを表示させます。
火花エフェクトと火花オーディオ コンポーネントを使いたいので、Target Blueprint から検索します。
-
以下のサンプル スクリプトは、プレイヤーがキューブに入ると火花エフェクトと火花オーディオを無効にすることを表しています。
スポーンしたアクタのダイレクト ブループリント通信
2 つのブループリント間で通信したい場合、片方 (または複数) がまだレベルに配置されていない場合があるかもしれません (例、プレイヤーがボタンを押したときにスポーンするマジック エフェクト)。この場合、プレイヤー キャラクターもマジック エフェクトもレベルでスポーンされておらず、上記のように Target Blueprint とインスタンスを設定することはできません。
Spawn Actor from Class ノードを使用する場合、Return Value をドラッグしてそれを変数として割り当てることができます。
以下の例では、MyCharacter ブループリント内で F を押すと、Blueprint_Effect_Smoke ブループリントのインスタンスをプレイヤーの位置でスポーンさせ、それを Target Blueprint という変数に割り当てることを表しています。
次に、Blueprint_Effect_Smoke ブループリント (上の黄色のボックスに入っています) にアクセスし、Target Blueprint からスモーク エフェクトとスモーク オーディオ コンポーネントを取得し、2 回めに F が押されたら 無効 にします (これが Flip/Flop ノードが行うことです)。従って、別のブループリント内から ダイレクト ブループリント通信 でブループリントにアクセスしています。
詳しい情報については、「ブループリント通信の使用方法」を参照してください。
ブループリントのキャスティング
この例では、レベルに炎のエフェクトのブループリント (アクタ) があり、プレイヤーが使用しているプレイ可能な Character ブループリント と通信させたいとします。プレイヤーが炎に入ると、その旨とダメージを受けるべきであるという信号を Character ブループリント に送るようにします。OverlapEvent の Return Value を使用して、Character ブループリントに Cast To し、その中のイベント、関数、変数にアクセスできます。
- 上記の炎は Blueprint_Effect_Fire アセットです (スターター コンテンツにあります)。
- Trigger という球体コンポーネントがブループリントに追加され、コリジョンは OverlapOnlyPawn に設定されています。
Blueprint Casting を使用して以下を行います。
-
Default Pawn Class (プレイ可能なキャラクター) に割り当てられた Character Blueprint は、アクセスする Target Blueprint です。
[Default Pawn Class] は、[Edit (編集)] メニューの [Project Settings (プロジェクト設定)] の[Maps & Modes] セクションにあります。
-
ターゲットが MyCharacter ブループリントであるとわかっているため、その中でプレイヤーが Is on Fire であるかを示す Bool 変数を作成できます。
上の画面では Event Tick が Branch に送られ、True ならば Apply Damage を画面にプリントします (True からは、ダメージスクリプトを適用するであろう場所)
-
Blueprint_Effect_Fire ブループリント内で、Trigger に対して 2 つのイベントを追加します。OnComponentBeginOverlap と OnComponentEndOverlap です。
-
イベントを追加した状態で、Other Actor ピンをドラッグして、検索フィールドに Cast To My と入力します。
イベントをトリガーするアクタ (MyCharacter Blueprint) をチェック/割り当てし、それに Cast To し、炎のブループリント内でアクセスできるようにします。
-
Cast To MyCharacter オプションを選択します。
-
ノードを追加した状態で、As My Character C ピンをドラッグして、その中のイベント、変数、関数などにアクセスできます (この場合は、Set Is on Fire)。
-
Blueprint_Effect_Fire ブループリントにある両方のイベントは以下のようになります。
炎がオーバーラップする場合、MyCharacter ブループリントの IsOnFire 変数を True に設定します。オーバーラップしない場合は、False に設定します。 MyCharacter ブループリント内で、IsOnFire が炎のブループリントで True に設定されている場合、Apply Damage を画面にプリントします (または、ヘルス/ダメージ システムを作成した場合は、ダメージを適用し、ここでプレイヤーのヘルス値を減らすことができます)。
他のタイプのキャスティング
ブループリント の異なる分類に Cast To できる特別な関数がいくつかあります。
以下の例を表したものが上図です。
ブループリント | 説明 |
---|---|
Character (1) | ここでは、Get Player Character ノードを使用し、MyCharacter という Character ブループリントにキャストしています。 |
PlayerController (2) | ここでは、Get Player Controller ノードを使用し、MyController というプレイヤー コントローラにキャストしています。 |
Game Mode (3) | ここでは Get Game Mode ノードを使用し、MyGame という Game Mode ブループリントにキャストしています。 |
Pawn (4) | ここでは Get Controlled Pawn ノードと Get Player Controller ノードを使用して、MyPawn という Pawn ブループリントにキャストしています。 |
HUD (5) | ここでは、Get HUD ノードと Get Player Controller ノードを使用して、MyHUD という HUD ブループリントにキャストしています。 |
上の各例では、As My X ノード (この場合の X はブループリントのタイプ) をドラッグすると、各ブループリントからイベント、変数、関数などにアクセスできます。
また注意すべき点として、Get Player Character ノードと Get Player Controller ノードにある Player Index 値を使用して、マルチプレイヤー シナリオで様々なプレイヤーを指定することができます。シングル プレイヤーのシナリオでは、こうした値を 0 のままにします。
ターゲット ブループリントのキャスティング
変数を使用して、アクセスするために特殊なタイプのブループリントに Cast To するインスタンスもあります。
上の画像の (1) は、Save Game Object が作成され、SaveGameObject 変数に割り当てられます。次に、その変数を使用して、MySaveGame という Save Game ブループリントに Cast To します。これは、ハイスコア、ベストラップタイムなどの保存ゲーム情報を渡す、または取り出すために使用できます。
上の画像の(2) では、Widget ブループリント が作成され、UserWidget 変数に割り当てられます。次に、この変数を使用して MyWidgetBlueprint という Widget ブループリントに Cast To します。これは、Widget ブループリントからの情報を更新または取り出すために使用できます (これはアクセスしたい HUD またはその他の UI になります)。
イベント ディスパッチャー
以下では、bush (低木) アクタの ブループリント がレベルにあります。このブループリントは、プレイヤーがボタンを押して低木に火を放ち、数秒後に炎を消し低木を破壊する場合に、Character ブループリント からの通信を受信させたいブループリントです。Character ブループリント から Level ブループリント に通信させます。これは、イベント ディスパッチャー** を使用して行います。
- 上記の低木は SM_Bush アセットです (スターター コンテンツにあります)。
イベント ディスパッチャー を使用して以下を行います。
-
MyCharacter ブループリント内で、[Event Dispatcher] アイコンをクリックするか、アイコンが隠れている場合は、 >> 矢印をクリックします。イベント ディスパッチャーに「StartFire」と名前を付けます。
-
グラフ内で 右クリック して、F キー イベントを追加します。次に、[Pressed] から、Call StartFire イベント ディスパッチャーを探して追加します。
-
コンパイル し 保存 してから、MyBlueprint を閉じます。
-
レベル内で [Bush] をクリックして選択し、次に Level Blueprint を開きます。
-
グラフ内で 右クリック して、レベルから Bush へのリファレンスを追加します。
-
右クリック して、Event Begin Play ノードと Get Player Character ノードを追加し、次に、Get Player Character から Cast To MyCharacter にします。
-
As My Character C で、Assign Start Fire イベント ディスパッチャーを追加します (Binded Event が新規作成されます)。
-
StartFire_Event で、SpawnActorFromClass ノード(Blueprint_Effect_Fire に設定されているクラス) を追加します。Transform は、SM_Bush Transform を取得します。
-
Spawn Actor ノードの Return Value から、Assign On Destroyed ノードを追加します。
-
OnDestroyed_Event からターゲットを SM_Bush とする Destroy Actor ノードを追加します。
-
Bind Event to OnDestroyed から、Delay (3 秒) を追加します。次に、ターゲットが Spawn Actor ノードからの Return Value である Destroy Actor を追加します
最後のいくつかの手順は、上のグラフのような結果になるはずです。
コンパイルし、保存してからエディタで再生すると、F キーを押すと炎エフェクトが低木内でスポーンします。3 秒後、炎と低木の両方がレベルから取り除かれます。
これは簡単な例なので、チェックの頻度を増やしたり (プレイヤーが低木の近くにいたら火を放つことができるようにする)、プレイヤーが一回だけ火を放つことを可能にすることも可能です。この例ではあくまでも、 イベント ディスパッチャー を使った Character ブループリント で Level ブループリント 内でイベントをどのように実行するかを表しています。さらに、上の例では、アクタに何かが起こった場合に (ここでは、破壊) イベント ディスパッチャー をスポーンしたアクタに割り当て、イベントを実行する方法も示しています。
詳しい情報については、イベント ディスパッチャー ドキュメントをご覧ください。
ブループリント インターフェース
以下では、レベル内に 4 つの ブループリント があります。トリガーとして機能するキューブ、炎エフェクト、火花エフェクト、および吊り下げ式照明の 4 つです。プレイヤーがキューブに入ったら、炎、照明、火花のそれぞれが別々のことを行うようにします。さらに、プレイヤーがキューブに入るたびに、キャラクターの移動速度を速めます。
- 上の画像のキューブは、Shape_Cube メッシュを使用して作成した ブループリント であり、そのコリジョンはトリガーとして機能するように OverlapOnlyPawn に設定されています。
- 上の画像の火花は Blueprint_Effect_Sparks アセットです (スターター コンテンツにあります)。
- 上の画像の炎は Blueprint_Effect_Fire アセットです (スターター コンテンツにあります)。
- 上の画像の照明は Blueprint_CeilingLight アセットです (スターター コンテンツにあります)。
Blueprint Interface を使用するとプレイヤー キャラクターのブループリントだけでなく 3 種類のブループリントと通信することができます。
それぞれと通信するためには、以下を行います。
-
コンテンツ ブラウザ の空のスペースで、右クリック して、ブループリント を選択し、次に [Blueprint Interface] を選択します。
-
このインターフェースに「CubeInterface」(または他の何らかの名前) と名前を付けます。次に、その上で ダブルクリック して開き、[Add Function (関数を追加)] ボタンをクリックします。
-
新しい関数に「MagicCube」または任意の名前を付けます。次に、コンパイル し、保存 して、このインターフェースを閉じます。
-
Cube ブループリントを開きます。次に、StaticMesh 上で 右クリック し、OnComponentBeginOverlap イベントを追加します。
-
Targets という Actor 変数を作成し、[Variable Type (変数タイプ)] の隣にあるボックスをクリックして [Array (配列)] にし、[Editable (編集可能)] ボックスにチェックを入れます。
これでこの ブループリント インターフェース の影響を受けるアクタが保存されます。
-
グラフ内で 右クリック し、Interface Messages で MagicCube (または各自で付けた名前) をクリックします。
-
以下のようにグラフをセットアップします。コンパイル し 保存 してから、ブループリントを終了します。
Targets 変数を引き出して Add ノードにドラッグします。
Targets を MagicCube ノードに接続し、Get Player Character ノードを Add ノードに接続します。
-
レベル内でキューブを選択し、[Details (詳細)] パネルでターゲットにある + 記号をクリックし、炎、照明、火花をレベルから追加します。
-
Blueprint_Effect_Fire ブループリントを開きます。ツールバーの [Blueprint Props] ボタンをクリックします。
-
インターフェース の [Details] パネルの [Interfaces] ボタンをクリックし、使用しているインターフェース (この例では、CubeInterface_C ) を選択します。
-
グラフ内で 右クリック し、Add Event の Event Magic Cube Event を選択します。
-
Event Magic Cube に続くものは、プレイヤーがキューブに入ると実行されます。
プレイヤーがキューブに入る場合の炎のサイズを大きくし、2 回めに入るときには、リセットします。
-
Blueprint_CeilingLight ブループリントを開き、[Blueprint Props] をクリックし、前述と同様に [Details (詳細)] パネルからインターフェースを追加します。
-
グラフ内で右クリックして、Event Magic Cube Event を追加し、このイベントに続くものは、プレイヤーがキューブに入ると実行されるようにします。
明るさを 0 に設定して照明をオフにし、明るさを 1500 に設定して照明をオンにします。
-
Blueprint Props を Blueprint_Effect_Sparks ブループリントに追加するプロセスを繰り返します。次に、CubeInterface_C を追加します。
キューブに入るときに火花エフェクトを上に移動し、2 回目にキューブに入るときに下に移動します。
-
Blueprint Props を MyCharacter ブループリントに追加するプロセスを繰り返します。次に、CubeInterface_C を追加します。
さらに、プレイヤーがキューブに入るたびに、キャラクターの移動速度を 100 単位で速めます。
上記の例からわかるように、ブループリント インターフェース を使用すると数種類の ブループリント と一度に通信し、各ブループリントは同じ単一のソース (この場合はトリガー) を起因とする様々な関数を実行できます。
この例では、複数のブループリントで機能を実行するイベントがありますが、ブループリント インターフェース の用途は、これだけではありません。次のセクションでは、ブループリント インターフェース を使用してブループリント間で変数がどのように渡されるかについて説明します。
ブループリント インターフェースを介して変数を渡す
以下は、Blueprint_Effect_Fire ブループリントです。これは、プレイヤー キャラクターのライフ状態を表します。
このブループリントはプレイヤーのヘルスをチェックし、0 になったら、消滅します。
- 上の画像の炎は Blueprint_Effect_Fire アセットです (スターター コンテンツにあります)。
ブループリント インターフェース を使用し、2 つの変数を渡して (プレイヤーのヘルスとプレイヤーが倒されたか否か) いつ消えるかを炎に通知できます。
以下は、こうした変数を渡すセットアップ方法です。
-
コンテンツ ブラウザ の空のスペースで、右クリック して、ブループリント を選択し、次に [Blueprint Interface] を選択します。
-
このインターフェースに「BP_Interface」 (または他の何らかの名前) と名前を付けます。次に、その上で ダブルクリック して開き、[Add Function (関数を追加)] ボタンをクリックします。
-
新しい関数に、「GetHealth」と名前を付けます。[Details (詳細)] パネルで、 [New] ボタンをクリックして [Outputs] を 2 つ追加します。
-
新しい 2 つの出力のひとつを playerIsDead と呼ばれる Bool にし、もうひとつを playerHealth と呼ばれる Float にします。次に、コンパイル し、保存 してブループリント インターフェースを閉じます。
-
MyCharacter ブループリントを開きます。ツールバーの [Blueprint Props] ボタンをクリックします。
-
インターフェース の [Details (詳細)] パネルで [Add (追加)] ボタンをクリックし、インターフェース (この例では、BP_Interface_C ) を選択します。
-
OutOfHealth と呼ばれる Bool 変数を作成し、PlayerHealthValue と呼ばれる Float 変数を作成します。コンパイル し、PlayerHealthValue を 100 に設定します。
-
[MyBlueprint] の [Interfaces] セクションで、GetHealth 関数を ダブルクリック して開きます。
-
グラフ内で OutOfHealth と PlayerHealthValues をドラッグし、以下のように ReturnNode に接続します。
これで、MyCharacter ブループリントに保存されている値がブループリント インターフェースに渡されます。
-
MyCharacter ブループリントの EventGraph に戻り、以下のセットアップを再作成します。
プレイヤーのヘルス値が 0 よりも大きく、プレイヤーが F を押すと、現在のヘルス値から 25 を差し引き、TakeDamage と呼ばれる イベント ディスパッチャー を呼び出します。 ヘルスが 0 以下である場合、OutOfHealth と呼ばれる Bool 変数を true に設定し、TakeDamage と呼ばれるイベント ディスパッチャー を呼び出します。イベント ティックを使用してティック毎に他のブループリントがプレイヤーのヘルスをチェックするのではなく、イベント ディスパッチャー を使用してプレイヤーがダメージを受けたことを別のブループリントに通知します。
-
変数を渡したいブループリントを開き (Blueprint_Effect_Fire)、[Blueprint Props] ボタンをクリックし、 [Details (詳細)] パネルでインターフェースを 追加 します。
-
EventGraph で、MyCharacter ブループリントからイベントを TakeDamage Event にバインドします。
Get Player Character ノードと Cast To MyCharacter ノードをドラッグします。次に As My Character C から、Take Damage を割り当て、Binded Event を作成します。
-
Binded Event、TakeDamage_Event から、GetHealth インターフェース メッセージを追加します。
Call Function ではなく、必ず Interface Message を実装するようにします。
-
以下のセットアップを再作成します。
画像をクリックしてフルサイズで表示
GetHealth インターフェースが一連の Branch ノードに接続されています。最初の Branch ノードが、PlayerIsDead (MyCharacter ブループリントで定義されています) か否かをチェックし、そうであれば、テキストが画面にプリントされ、炎のエフェクト/オーディオが無効になります。
2 つめの Branch ノードが PlayerHealth 値が 0 であるか否かをチェックし、0 であればキャラクターの「消滅」まで「1 ヒット」というテキストが画面にプリントされます。これは必ずしも完璧なヘルス/ダメージのセットアップではありませんが、2 つの変数をインターフェースを介して渡す方法と、こうした変数を別のブループリントで使用する方法を表すものです。「プレイヤーのヘルス」値は、この例では HUD に渡し、例えば現在のヘルスを反映するために更新することができます。
詳しい情報については、ブループリント インターフェース ドキュメントをご覧ください。