Choose your operating system:
Windows
macOS
Linux
アクタ と同様に 関数 もネットワーク上でレプリケーション可能であり、変数も同様です。ゲームプレイに重要な変数だけを Network Authority (サーバー) 側で編集し、知っておく必要のある情報のみをリモートのマシン (クライアント) にレプリケートします。いつ変数が変更できるかは不正につながりうるためクライアントに定義させないようにします (ヘルス、弾薬、経験値など)。
変数を Replicated に設定することができます。つまり、この変数はサーバーからクライアントにレプリケートされる変数の 1 対 1 のコピーを作ります。または、RepNotify 変数を使用することもできます。RepNotify は Replicated が行うことを何でも行うだけでなく、アタッチされている変数が更新されるたびに呼び出され、サーバーとクライアントの両方のマシンで実行する関数を提供します。
このページでは、 Replicated 変数と RepNotify 変数の使用例について説明します。
Replicated
この例では、 スターター コンテンツ を有効にして Blueprint Third Person テンプレート を使用します。
この例では、Replicated 変数を作成します。これは、サーバーとクライアントの両方で見ることができるカウントダウン タイマーで使用されます。
-
「Content/StarterContent/Blueprints」 フォルダ内で、 Blueprint_Effect_Fire ブループリントを開きます。
-
Class Defaults を選択した状態で、 [詳細] パネルの [Replication] で [Replicates] オプションにチェックを入れます。
これで、このブループリントがネットワーク上で接続されているすべてのマシンに確実にレプリケートされるようにします。
-
[Components] ウィンドウから [Add Component] ボタンをクリックして、 Text Render コンポーネントを検索して追加します。
-
[Viewport] タブでテキストが見えやすくなるように炎の上のお好みの位置に移動します。
-
[Event Graph] タブをクリックし、グラフ内で 右クリック し、 Event Begin Play ノードを追加します。
-
Event Begin Play ピンからドラッグして、 Switch Has Authority ノードを検索して追加します。
-
Authority ピンからドラッグして、 Time を 1 に設定し、 Looping にチェックを入れた Set Timer ノードを追加します。
ここでは、Switch Has Authority ノードを使用して、このブループリントがスポーンしたときに Authority (Server) でのみ Set Timer 関数を呼び出します。このノードを使用して Timer 関数が確実にサーバーでのみ実行し、クライアントでは実行されないようにします。このスクリプトがゲームのクリティカル データを処理する場合、不正を防ぐために、クライアントで実行するのではなくサーバーでのみ実行し、それからクライアント マシンにデータをレプリケーションするようにします。
-
[MyBlueprint] ウィンドウで、 CountDownTimer と呼ばれる新規変数を作成します。
-
新規変数の [Details (詳細)] パネルで、 Integer 型に変更し、 コンパイル し、 Default Value を 10 に設定します。
-
グラフ内で 右クリック して、 カスタム イベント を新規で作成し、 Update Timer という名前にします。
-
Update Timer を Branch ノードに接続し、 True ピンから Set CountDownTimer ノードを追加します。
-
グラフ内で 右クリック して、 Get CountDownTimer ノードを追加します。次にそこからドラッグして Int - Int ノードを使用してそのボックスに 1 を入力します。
-
CountDownTimer ノードから再度ドラッグして Int > Int ノードを使用して以下のようにノードを接続します。
ここでは、 UpdateTimer が呼び出されるたびに CountDownTimer に対してそこから 1 を差し引くこと (ただしタイマーが 0 より大きい場合に限る) を指示しています。
-
Set Timer ノードの Function Name でカスタム イベント ( UpdateTimer ) の名前を追加します。
これで、タイマーに対してストップと指示するまで UpdateTimer イベントが1秒毎に呼び出されます。
-
グラフ内で 右クリック して、 Event Tick ノードを追加します。
-
Control キーを押した状態で MyBlueprint ウィンドウから TextRender コンポーネント内でドラッグし、そこからドラッグして Set Text ノードを使用します。
-
Control を押しながら、 CountDownTimer 変数をドラッグしてそれを Set Text ノードの Value に接続します。
変換ノードが自動的に作成されます。ここでは、テキストをカウントダウン タイマーの値に設定します。
-
コンパイル し 保存 してから、ブループリントを閉じます。
-
コンテンツ ブラウザ から Blueprint_Effect_Fire をレベルにドラッグします。
-
メインツールバーで [Play] ボタンの横にある下向きの矢印をクリックし、 Number of Players を 2 に設定します。
-
[Play (プレイ)] ボタンをクリックして、エディタで再生します。
エディタで再生する場合、 Server は 0 までカウントダウンしますが、 クライアント はしません。
-
Blueprint_Effect_Fire ブループリントに戻ります。
-
CountDownTimer 変数の [詳細] パネルの Replication を、 Replicated に設定します。
これで、このプロパティは接続されているマシンにレプリケートされます。
-
グラフが更新し、 CountDownTimer 変数の各インスタンスにはレプリケートされたアイコンが含まれます。
-
コンパイル し 保存 してから、ブループリントを閉じてエディタで再生します。
これでサーバーとクライアントの両方で 10 からカウントダウンするようになり、テキストが適切に表示されます。テキスト レンダーを更新するために整数を使用していますが、この変数はプレイヤー キャラクターのヘルス、武器、その他のゲームプレイ関連の変数を表すために簡単に使用することができます。
RepNotify
この例では、引き続き上記の Replicated の例を使用します。
上記の Replicated の例では、サーバーとクライアントの両方で表示されるカウントダウン タイマーを作成しました。ここの例では、 RepNotify 変数を使用し、カウントダウン タイマーが 0 になると信号を送り、この時点でサーバーとクライアントの両方で炎のエフェクトを無効にします。
-
Blueprint_Effect_Fire ブループリントを開きます。
-
[MyBlueprint] ウィンドウで、 Control を押しながら P_Fire エフェクト内でドラッグして、そこからドラッグして Deactivate ノードを使用します。
-
Update タイマーに接続された Branch の False ピンから、 Deactivate ノードを以下のように接続します。
ここでは、 UpdateTimer が呼び出されると、 CountDownTimer から 1 を差し引くこと (0 より大きい場合に限り) を示しています。0 よりも大きくなければ、 P_Fire パーティクル エフェクトを Deactivate します。
-
コンパイル し 保存 してから、ブループリントを閉じてエディタで再生します。
エディタで再生する場合、0 になると炎のエフェクトはサーバー側でのみ無効になります。
-
Blueprint_Effect_Fire ブループリントに戻ります。 Deactivate と呼ばれる Boolean 型の変数を新規で作成します。
-
Deactivate 変数で、 Replication タイプを RepNotify に必ず設定するようにします。
-
変数を RepNotify に設定後、新しい関数が自動的に作成されたことがわかります。
これは、RepNotify として代入された変数が変更するたびに呼び出され、サーバーとクライアントのマシンの両方で実行されます。
-
On Rep Deactivate 関数を ダブルクリック して開きます。
-
Control を押しながら P_Fire コンポーネント内でドラッグして、そこから Deactivate ノードを追加します。
-
Event Graph に戻り、 UpdateTimer イベントを探します。
-
Branch の False から、 True に設定するようにチェックが入った Set Deactivate ノードを追加します。
変数に Set w/Notify と表示され、Notify 関数も呼び出されることを表しています。
-
コンパイル し 保存 してから、ブループリントを閉じてエディタで再生します。
今回はエディタで再生すると、タイマーが 0 になったときにクライアントとサーバーの両方で炎のエフェクトが無効になります。