クラスタ イベントは、nDisplay クラスタのすべてのノードにイベントに同時に応答させる手段です。
- クラスタ イベントはクラスタ内でノードから生成します。または外部アプリケーションのプライマリ ノードにクラスタ イベントを送信することで生成します。「ブループリントからクラスタ イベントを発行する」または「外部アプリケーションからクラスタ イベントを発行する」を参照してください。
- クラスタのプライマリ ノードがクラスタ イベントを受信すると、厳密に同じフレームの各ノードでそのクラスタ イベントが発生するように、クラスタの各ノードにそのクラスタ イベントがプロパゲートされます。
- Unreal Engine アプリケーションのブループリント ロジックまたは C++ ロジックで、これらのクラスタ イベントを検出するようにリスナーを設定し、プロジェクトに必要なあらゆるゲームプレイ ロジックでクラスタ イベントに応答できるようにします。「ブループリントでクラスタ イベントに応答する」を参照してください。
クラスタ イベントの形式
クラスタ イベントに対して nDisplay でサポートされている形式は 2 種類あります。JSON とバイナリです。JSON は人間が読み取ることのできる形式です。ASCII (一部の文字は JSON 標準で禁止されている) を使用し、特定のスキーマに従ってデータを構築する必要があります。バイナリ形式では、任意のバイナリ データを使用できます。シリアル化と逆シリアル化はユーザー次第です。クラスタ イベントでは、JSON 形式よりもバイナリ形式を使用する方がデータのスループットとレイテンシーの点で優れたパフォーマンスを発揮します。
JSON クラスタ イベントの構造
各 JSON nDisplay クラスタ イベントは、次の複数のプロパティで構成されている場合があります。
設定 | 型 |
---|---|
Name | 文字列 |
Type | 文字列 |
Category | 文字列 |
SystemEvent | それがシステム イベントであるかユーザー イベントであるかを指定するブール値。このフラグを自分で設定する必要はありません。 |
ShouldDiscardOnRepeat | 現在のフレームで既に受け取った同じ Name、Type、および Category のイベントを破棄するかどうかを指定するブール値。 |
Parameters | オプションのキー/値のペアのマップ。ここで、キーと値はどちらも string。 |
これらの各プロパティで送信するデータの種類と、リスナーがそのデータを解釈する方法をプロジェクトで決定するのはユーザーです。
ブループリントで JSON クラスタ イベントとやり取りするときは、Make DisplayClusterClusterEventJson ノードおよび Break DisplayClusterClusterEventJson ノードを使用して、JSON クラスタ イベントを作成および分解します。使用するコマンドの例:
C++ では、または独自のアプリケーションから JSON クラスタ イベントを発行する場合は、FDisplayClusterClusterEventJson
を使用して同じ構造を表します。
バイナリ クラスタ イベントの構造
各バイナリ クラスタ イベントは、次の複数のプロパティで構成されている場合があります。
設定 | 型 |
---|---|
Event Id | 32 ビットの整数 |
System Event | それがシステム イベントであるかユーザー イベントであるかを指定するブール値。このフラグを自分で設定する必要はありません。 |
ShouldDiscardOnRepeat | 現在のフレームで既に受け取った同じ Event Id のイベントを破棄するかどうかを指定するブール値。 |
Event Data | バイトの配列 |
これらの各プロパティで送信するデータの種類と、リスナーがそのデータを解釈する方法をプロジェクトで決定するのはユーザーです。
ブループリントでバイナリ クラスタ イベントとやり取りするときは、Make DisplayClusterClusterEventBinary ノードおよび Break DisplayClusterClusterEventBinary ノードを使用して、バイナリ クラスタ イベントを作成および分解します。使用するコマンドの例:
C++ では、または独自のアプリケーションから バイナリ クラスタ イベントを発行する場合は、FDisplayClusterClusterEventBinary
を使用して同じ構造を表します。
ブループリントからクラスタ イベントを発行する
次の例で、ブループリント クラスから JSON クラスタ イベントを発行する方法を示します。これと同じ手順に多少の修正を加えると、ブループリント クラスからバイナリ クラスタ イベントを発行することができます。
プロジェクトでブループリント クラスから JSON クラスタ イベントを発行するには、次の手順を実行します。
- DisplayCluster Module API (「ブループリント API」を参照) を取得して、[Cluster (クラスタ)] の Emit JSON cluster event (Interface Call) 関数を呼び出します。このノードによりクラスタ イベントのプライマリ ノードへの出力が開始されます。これにより、クラスタ内のすべてのノードにクラスタ イベントがプロパゲートされます。
- デフォルトでは、ゲームプレイ ロジックでこのブループリント ノードを評価する Unreal Engine アプリケーションのすべてのインスタンスがこのクラスタ イベントを起動します。このブループリント グラフがクラスタ内の多くの異なるノードで評価されると、クラスタ イベントの複数のコピーが生成される可能性があります。 クラスタ イベントの複数のコピーが生成されないようにするには、Emit JSON cluster event ノードで [Master Only (マスターのみ)] ブール値を設定します。このボックスをオンすると、プライマリ ノードのみでクラスタ イベントが発行されます。その他すべてのプライマリ以外のクラスタ ノードが同じブループリント グラフを評価しても、イベントは発行されません。
- Emit JSON cluster event ノードの Event ポートから左にドラッグして、[Make DisplayClusterClusterEventJson] を選択します。
- Make DisplayClusterClusterEventJson ノードの設定で、[Name (名前)]、[Type (型)]、および [Category (カテゴリ)] の文字列値を使用してクラスタ イベントを設定します。クラスタ イベントと一緒に任意のキー/値データを渡す必要がある場合は、それらのキーと値のマップを Parameters 入力に渡すこともできます。
- ブループリントを コンパイル して 保存 します。
次回プロジェクトを再パッケージ化して、nDisplay クラスタを再起動すると、このブループリント コードにより、設定した JSON クラスタ イベントが起動されます。ブループリント コードの他の場所でこのイベントに応答するには、「ブループリントでクラスタイベントに応答する」を参照してください。
外部アプリケーションからクラスタ イベントを発行する
nDisplay クラスタを起動すると、プライマリ ノードにより特定のローカル ポートで受信クラスタ イベントのリッスンが開始されます。そのポートに接続してメッセージを送信することで、ネットワーク内の他のすべてのコンピュータで実行されている他のアプリケーションから nDisplay システムに新しいクラスタ イベントを発行できます。JSON ポート リスナーとバイナリ ポート リスナーはいずれも TCP を使用します。そのため、クラスター セッションが終了するまで接続を開いておくことができます。
このメッセージは、発行するクラスタ ノードごとに、次の規則に従う必要があります。
- 先頭の 4 バイトでメッセージの残りの部分の全長を指定する必要がある。
- メッセージの残りの部分は、JSON オブジェクトまたはバイナリ データとして表されるクラスタ イベントのコンテンツである必要がある。
- JSON イベント メッセージの場合:
- JSON オブジェクトと必須フィールドである Name、Type、Category、SystemEvent、ShouldDiscardOnRepeat、およびオプションのフィールドである Parameters。
- バイナリ イベント メッセージの場合:
- Event ID は 4 バイトとする。
- System Event のブール値は 1 バイトとする。
- ShouldDiscardOnRepeat のブール値は 1 バイトとする。
- バイナリ データは N バイトとする。N に制限はない。
- JSON イベント メッセージの場合:
例えば、名前が "quit" で型が "command" の JSON クラスタ イベントを発行するには、次の手順を実行します。
- クラスタ ノードの値を含む JSON 文字列を作成します。この場合、JSON 文字列は次のようになります。
{"Name":"quit","Type":"command","Category":"","Parameters":{}}
Name、Type、および Category の各フィールドは必須ですが、Parameters フィールドは省略できます。いくつかのフィールドは必須ですが、どのフィールドにも空の値を割り当てることができます。というのも、空のフィールドを持つイベントはグループ化されるからです。可読性のため、名前と ID を指定することをお勧めします。
- JSON 文字列の長さ (この場合は、62 文字) を取得して、その長さを 4 バイトのバイナリ形式で nDisplay プライマリ ノードに送信します。この例では、
0x00111110
となります。 - JSON 文字列自体を nDisplay プライマリ ノードに送信します。
デフォルトでは、プライマリ ノードはポート 41003 でクラスタ イベントを、ポート 41004 でバイナリ クラスタ イベントをリッスンします。このデフォルトは、nDisplay コンフィギュレーション ファイルで変更できます。「nDisplay 通信ポートを変更する」を参照してください。
プロジェクトのブループリント コードでこれらのクラスタ イベントに応答するには、「ブループリントでクラスタ イベントに応答する」を参照してください。
ブループリントでクラスタ イベントに応答する
クラスタ イベントを nDisplay ネットワークに送信するための上記のいずれかの方法を設定したら、送信されたクラスタ イベントを検出して、何らかの方法で応答できるように、ブループリント (または C++) のゲームプレイ ロジックを設定する必要があります。このためには、リスナー (DisplayClusterClusterEventListener インターフェースを実装するクラス) を作成して登録する必要があります。nDisplay API から Add Cluster Event Listener 関数を呼び出してリスナーを登録し、Event On Cluster Event ノードを使用してクラスタ イベントを検出して応答します。
例えば、新しいブループリント クラスを作成して、そのクラスをリスナーとして登録するには、次の手順を実行します。
-
コンテンツ ブラウザ で右クリックして、[Create Basic Asset (基本アセットの作成)] > [Blueprint Class (ブループリント クラス)] を選択します。
-
親クラスとして [Actor (アクタ)] を選択します。
-
コンテンツ ブラウザ で新しいリスナー クラスの名前を入力します。
-
レベルのビューポートでクラスをドラッグして、レベルにドロップします。
- 新しいブループリント クラスをダブルクリックして、編集します。
-
ツールバーで、[Class Settings (クラス設定)] をクリックします。
-
[Details (詳細)] パネルで、[Interfaces (インターフェース)] > [Implemented Interfaces (実装済みインターフェース)] の設定を確認して、[Add (追加)] をクリックします。
- リストで DisplayClusterClusterEventListener インターフェースを確認して選択します。
-
ツールバーの [Compile (コンパイル)] をクリックしてクラスをコンパイルします。
- [Event Graph (イベント グラフ)] タブで、次のグラフを設定してリスナーを登録します。
これを設定するには、次の手順を実行します。 1. Begin Play Event ノードの出力を右にドラッグして、[N Display (N ディスプレイ)] > [DisplayCluster Module API] を選択します。 1. Get DisplayCluster Module API ノードの Out API ポートを右にドラッグして、[Display Cluster (ディスプレイ クラスタ)] > [Cluster (クラスタ)] > [Add cluster event listener (Interface Call)] を選択します。 1. 最後に、Add cluster event listener ノードの Listener ポートを左にドラッグして、[Variables (変数)] > [Get a reference to self] を選択します。
- また、不要になった場合は、作成した各リスナーを破棄することをお勧めします。例えば、Blueprint アクタが破棄された場合は、リスナーを破棄することができます。
これを設定するには、次の手順を実行します。 1. [Event Graph (イベント グラフ)] を右クリックして、[Add Event (イベントの追加)] > Event Destroyed ノードを選択します。 1. Event Destroyed ノードの出力を右にドラッグして、[N Display (N ディスプレイ)] > [DisplayCluster Module API] を選択します。 1. そのノードの Out API ポートを右にドラッグして、[Display Cluster (ディスプレイ クラスタ)] > [Cluster (クラスタ)] > [Remove cluster event listener (Interface Call)] を選択します。 1. 最後に、Remove cluster event listener ノードの Listener ポートを左にドラッグして、[Variables (変数)] > [Get a reference to self] を選択します。
- [Event Graph (イベント グラフ)] の他のエリアで、[Add Event (イベントの追加)] > [N Display (N ディスプレイ)] > [Event On Cluster Event] を選択して、 Event On Cluster Event Json ノードを追加します。nDisplay クラスタで JSON クラスタ イベントが発生するたびに、このイベントがトリガーされます。 このイベントに割り当てられた設定とパラメータを確認し、これらに基づいて、ブループリントで実行する必要のあるアクションを特定できるようにすることをお勧めします。このためには、Event On Cluster Event Json ノードの Event ポートを右にドラッグして、Break DisplayClusterClusterEventJson を選択します。 例えば、次のグラフでは単に各 JSON クラスタ イベントの [Name (名前)] の値がスクリーンに出力されます。
- ブループリント クラスを コンパイル して 保存 します。
次回クラスタで JSON クラスタ イベントが任意のソースから発行されると、その JSON クラスタ イベントの名前がスクリーンに出力されます。