Language:
Page Info
Skill Level:
Engine Version:

ブループリントで関数をレプリケーションする方法

レプリケート関数 のセットアップ方法と様々な形式の使用方法を紹介します。

レプリケート関数は、主に以下の 3 種類に分類されます。MulticastRun on ServerRun on owning Client です。Multicast 関数は、実行され、その後自動でクライアント側に順送りされると、サーバー上で呼び出されます。Server 関数はクライアントによって呼び出され、サーバー上でのみ実行されます。Client 関数はサーバーで呼び出され、所有しているクライアント上でのみ実行されます。

Multicast

この例では、Blueprint Third Person テンプレート (with Starter Content) を使用します。

Multicast レプリケート関数を設定する方法を説明します。

  1. [Play] ボタンの横にある下向きの矢印をクリックし、 Number of Players4 に設定します。

    HowTo2.png

    [Advanced Settings] オプションで、マルチプレイヤー用に生成されたウィンドウのサイズを変更することができます。

  2. コンテンツ ブラウザContent/ThirdPersonBP/BlueprintsThirdPersonCharacter ブループリントを開きます。

  3. グラフを 右クリック し、 Space Bar Key Event を追加し、 Spawn Actor from Class ノードに接続します。

  4. 右クリック して Get Actor Transform ノードを追加し、ClassBlueprint_Effect_Fire に設定して以下のように接続します。

    HowTo3.png

    これを押すと、プレイヤー キャラクターの位置で炎のエフェクトがスポーンされます。

  5. コンパイル および 保存 をしたら、ブループリントを終了し、 [Play] ボタンをクリックしてエディタで再生します。

  6. ゲーム内で [Server] というウィンドウを探して、ジャンプするために スペース バー を押します。

    HowTo4.png

    スポーンされたエフェクトが見えるのはこのサーバー ウィンドウのみで、その他のプレイヤーからは見えません。

    他のプレイヤーでジャンプを試みる場合、他のプレイヤーは炎のエフェクトをローカルにのみスポーンし、それ以外のプレイヤーはエフェクトがスポーンされたことに気づきません。 さらに、炎のエフェクトはキャラクターにはアタッチされていないので、 スペース バー を押した時のみキャラクター位置でのみスポーンされます。

    Shift + F1 でマウス コントロールが可能になり、マルチプレイヤー テスティング中にゲームウィンドウ間をジャンプできます。

  7. ThirdPersonCharacter ブループリントで、Space Bar ノードの Pressed右クリック して切断します。

  8. 右クリック して Custom Event を見つけて追加し、 MulticastSpawn Event を呼び出します。

  9. カスタム イベントをクリックし、 [Details] パネルの [Replicates] のドロップダウン メニューを Multicast に設定し、以下のように接続します。

    HowTo5.png

    最後のいくつかのステップは上のような結果になり、カスタム イベントを Multicast Replication を使用するように設定しました。

  10. Space Bar Key Event を引き出して、コール関数 MulticastSpawn を探して追加します。

    HowTo6.png

    作成したカスタム イベントが見つからない場合は、 [Compile] ボタンをクリックして再度検索してください。

  11. コンパイル および 保存 をしたら、ブループリントを終了し、 [Play] ボタンをクリックしてエディタで再生します。

  12. ゲーム内で [Server] というウィンドウを探して、ジャンプするために スペース バー を押します。

    HowTo7.png

    今回は、スペース バーを押すとサーバーのプレイヤーがジャンプし、サーバーだけでなくすべてのクライアント上で炎のエフェクトがスポーンされる様子が確認できます。クライアントがエフェクトをスポーンしたことをサーバーに伝えていないので、他のプレイヤーでジャンプを試しても、エフェクトはまだローカルでしかスポーンされません。その設定方法を、次のセクション『 Run on Server 』で説明します。

Run On Server

このセクションでも、引き続き Multicast Replication からのサンプルを使用します。

Run on Server レプリケート関数の設定は、以下の手順でおこないます。

  1. コンテンツ ブラウザContent/ThirdPersonBP/BlueprintsThirdPersonCharacter ブループリントを開きます。

  2. MulticastSpawn Custom Event を選択し、Replicates ドロップダウン オプションを Run on Server に変更します。

    HowTo8.png

    整合を取るために Graph Node の名前を Run On Server に変更します。

  3. コンパイル および 保存 をしたら、ブループリントを終了し、 [Play] ボタンをクリックしてエディタで再生します。

  4. ゲーム内で [Server] 以外のゲーム ウィンドウを探し、ジャンプさせるために スペース バー を押します。

    HowTo9.png

    炎のエフェクトはどのプレイヤーがジャンプしてもサーバー上でのみスポーンされます。サーバー上のプレイヤー以外には見えません。このスクリプトは命令通りにサーバー上でのみ実行されているので、エフェクト自体がレプリケートされて、サーバーだけでなくすべてのクライアントに渡されるようにしてください。

  5. 「Content/StarterContent/Blueprints」 フォルダ内で、Blueprint_Effect_Fire ブループリントを開きます。

  6. メイン ツールバーで Class Defaults を選択し [Details] パネルで [Replicates] チェックボックスにチェックを入れます。

    HowTo10.png

  7. コンパイル および 保存 をしたら、ブループリントを終了し、 [Play] ボタンをクリックしてエディタで再生します。

  8. ゲーム内で [Server] 以外のゲーム ウィンドウを探し、ジャンプさせるために スペース バー を押します。

    HowTo11.png

    すべてのクライアント上でも見えるようにアクタをレプリケートする設定にしたので、サーバー側のスクリプトを部分的に実行するようにサーバーに実際にメッセージを送りました。

Run On Owning Client

このセクションでも、引き続き Multicast Replication からのサンプルを使用します。

このセクションでは、サーバー イベントが発行されると、ある特定のクライアントだけを更新する変数を作成してみます。

Run on owning Client レプリケート関数の設定は、以下のステップで行います。

  1. Content/ThirdPersonBP/Blueprints 」フォルダで ThirdPersonCharacter ブループリントを開きます。

  2. [MyBlueprint] ウィンドウで、新規に変数を作成し、 「Inventory」 という名前を付けて [Compile] をクリックします。

    Inventory.png

  3. 変数の [Details] パネルで StringEditableReplicated に設定し、 Default Value に 「Empty」と入力します。

    HowTo12.png

    この変数を Replicated に設定しておけば、接続先のマシンにネットワーク経由で確実にレプリケートされます。これを使って、マルチプレイヤー ゲームでキャラクターがトリガー ボリュームへ入った時にアイテムを拾い、トリガー ボリュームを去る時にアイテムを取り除くシミュレーションを行ってみます。

  4. Print String ノードに接続されている P Key Event を追加し、 Control を押しながら Inventory 変数へドラッグして、以下のように接続します。

    HowTo13.png

  5. コンパイル保存 してから、ThirdPersonCharacter ブループリントを閉じます。

  6. [Modes] ウィンドウの [Basic] タブにある Box Trigger をレベル内にドラッグします。

    HowTo14.png

    プレイヤー キャラクターがトリガー領域に入ると、作成した変数を更新しますが、トリガー ボックスに入ったクライアントのみが該当します。

  7. Box Trigger[Details] パネルで、 Rendering[Actor Hidden In Game] オプションのチェックを外します。

    UnHideBox.png

    これにより、エディタで再生する場合にレベルでボックスが見えるようになり、テストしやすくなります。

  8. [Box Trigger] をクリックして選択し、メイン ツールバーから [Level Blueprint] を開きます。

    HowTo15.png

  9. グラフを 右クリック して、 Begin Overlap を検索して、 Add On Actor Begin Overlap Event を選択します。

    HowTo16.png

  10. 前のステップを繰り返します。しかし、今回は Add On Actor End Overlap を検索して追加します。

  11. それぞれのノードを Switch Has Authority ノードに接続します。

    HowTo17.png

    Switch Has Authority ノードは、実行中のスクリプトがどこから実行されているのかを確認し、そのスクリプトの実行元がネットワーク経由の Authority (権限のある) マシン(通常はサーバー) または Remote (リモート) マシン (クライアント) のどちらなのかによって、2 つに分岐します。 サーバー側のみで発生させたいものに対しては、大抵、 Authority を使います (通常はゲームプレイにとって重要なものが該当します。例えば、プレイヤーのヘルス値の調整、報酬や略奪品の分配などがあります。不正行為ができないように、クライアントがこの種の変更をいつするかを決定できないようにします)。

    この例では、テキスト変数を更新してみます。これは、プレイヤーのヘルス値を含む変数や収集アイテムの変数が考えられます。

  12. グラフ内を 右クリック して、 Add Item という名前の Custom Event を追加します。

  13. Replicates オプションを Run on owning Client に設定し、 Actor に設定されている Character という名前の入力を追加します。

    HowTo18.png

    作成後、ノード上にエラーの警告が出た場合は、 [Compile] ボタンをクリックしてエラーを取り除きます。

  14. Remove Item」 という名前の Custom EventAdd Item Event と同じ設定でもう 1 つ作成します。

  15. Add Item ノードと Remove Item ノードを以下のように 2 つの Overlap Event に接続します。

    HowTo19.png

    トリガーがオーバーラップした時に、サーバー上でオーバーラップが発生すると、サーバー側の Add Item Event を実行し、それを所有するクライアント (トリガーをオーバーラップするキャラクター) へレプリケートすると宣言しています。「それ」とは、 Add Item の発行時に呼び出され、サーバー側でのみ実行されるがクライアントへレプリケートされるスクリプトを指します。キャラクターがトリガー ボックスを出ると、再度サーバー側が判断し、サーバーで Remove Item Event を実行して、それを所有するクライアントへレプリケートします。

  16. Add Item Event から Print String (テキストは Item Added に設定) を追加して、 CharacterCast To ThirdPersonCharacter を引き出します。

    HowTo20.png

  17. As Third Person Character ピンを引き出して、テキストが Has the Item に設定されている Set Inventory ノードを検索して追加します。

    HowTo21.png

    ここでは、サーバー側で実行されクライアント側へレプリケートされ、画面に「item added」とプリントした後で、所有するクライアントの Inventory テキスト変数を [Has the item] に設定するイベントを作成しています。

  18. Add Item Event に続く 3 つのノードをコピーして、 Remove Item Event に接続します。

  19. Print StringItem Removed に、Inventory テキスト変数を Empty に変更します。

    HowTo22.png

    これで、キャラクターがトリガーを出ると、テキスト変数がサーバー上で更新されて、所有するクライアントへレプリケートされます。

  20. コンパイル保存 してから、Level ブループリント を閉じてエディタでプレイします。

    この動画では、ゲームの起動時に、 P を押してテキスト変数を画面に印字すると、それが各キャラクターに対して「empty」と表示されます。ただし、キャラクターの 1 つがトリガーボックスへ入ると、[item added] というテキストが表示されます。このキャラクターが P を押すと、テキストが [has the item] に変わります。残りのキャラクターの表示は [empty] のままです。キャラクターがボックスを出ると、[item removed] が表示されますが、再度 P を押すとテキストは [empty] に戻ります。

    以上が、サーバー側でイベントを実行し、それらを個々のクライアントにレプリケートする方法の説明です。