INTSourceChangelist:2713562 Availability:Public Title:レプリケーションのサンプル Crumbs:%ROOT%, Gameplay, Gameplay/Framework Description:マルチプレイヤーに対応するネットワークゲームの設定 Related:Gameplay/Networking/Blueprints Related:Gameplay/Networking/Actors version:4.9 具体例を挙げるために、自分がネットワークゲームのクライアント側だと考えてみてください。敵 2 人が自分に向かって走ってきて、自分めがけて発砲し、その発砲音が聞こえます。全てのゲーム ステートは端末ではなくサーバー上で管理されているのに、 なぜこれらの事象を見たり聞いたりすることができるのでしょうか? 敵が見える理由は、敵がクライアントに関係あるとサーバーが認識し、サーバーがクライアントに対してアクタをレプリケートしているからです。このように、自分を追いかけまわす 2 つのプレイヤー アクタのローカル コピーが クライアント側にできます。自分を追いかける敵が見える理由は、 サーバーが敵の Location プロパティと Velocity プロパティをクライアント側にレプリケートしているからです。サーバーからの位置を更新中は、クライアントは敵の移動をローカルでシミュレーションします。銃声が聞こえる理由は、サーバーがクライアント側に ClientHearSound 関数を レプリケートしているからです。PlayerPawn が音を聞いたとサーバーが判断すると、 ClientHearSound 関数が呼び出されます。 ここまでで、アンリアル マルチプレイヤー ゲームを実行する詳細なメカニズムが明確になっているはずです。サーバーはゲーム ステートを更新し、重要なゲーム判断をすべて行います。サーバーは クライアントにアクタをレプリケートします。サーバーはクライアントに変数をレプリケートします。また、サーバーはクライアントに関数をレプリケートします。 全てのアクタをレプリケートする必要があるわけではない、ということもはっきりしています。例えば、アクタがレベルの半分まで行って見えなくなると、更新を送信するために帯域を無駄にする 必要がなくなります。また全ての変数を更新する必要もありません。例えば、 AI に判断をさせるためにサーバーが使用する変数は、クライアント側に送信する必要はありません。 クライアントが知らなくてはいけないのは、表示変数、アニメーション変数、物理変数だけです。さらに、サーバーで実行されるほとんどの関数はレプリケートしてはいけません。クライアント側で何かが見えたり聞こえたりする関数コールのみ、 レプリケートする必要があります。つまりすべてのサーバーには膨大な量のデータが含まれているのです。 プレイヤーが見たり聞いたり感じたりしてクライアントに関わるデータは、そのほんの一部です。 では「アンリアル エンジンはどうやってレプリケートする必要のあるアクタ、変数、関数コールが分かるのだろうか」という疑問が出てくると思います。 答えは、コードの記述またはクラス用にブループリントを設定する人が、レプリケートする必要のある変数と関数を判断しているのです。