Initial translation against INT#2472981

[CL 2493142 by Michiru Niwa in Main branch]
This commit is contained in:
Michiru Niwa
2015-03-26 23:11:56 -04:00
committed by Michiru.Niwa@epicgamesjapan.com
parent d08bfce3ee
commit 3f03dea3a9

View File

@@ -0,0 +1,60 @@
INTSourceChangelist:2472981
Availability:Public
Title:クライアント-サーバーモデル
Crumbs:%ROOT%, Gameplay, Gameplay/Networking
Description:マルチプレイヤーゲームにおけるサーバーの役割
Related:Gameplay/Networking/Actors
Related:Gameplay/Networking/Actors/Properties
Related:Gameplay/Networking/Actors/RPCs
Related:Gameplay/Framework
[TOC (start:2 end:3)]
## 概要
UE4 のマルチプレイヤーはクライアント-サーバーモデルに基づいています。これは、接続中のクライアントが近似値を保持する一方で、1つのサーバーだけがゲームステートの権限を持つことを意味します。
サーバーはUE4 マルチプレイヤーで重要な役割を果たします。重要な決定をすべて下し、正式なステートをすべて格納、クライアントとの接続を処理、新規マップへの移動、マッチを開始するためのゲームプレイフロー全体を処理、マッチの終了など、サーバーにはさまざまな役割があります。
## サーバーの起動
基本的なコマンドライン(これらのコマンドはエディタを使用するためクックしたデータは必要ありません)
| Type | Command |
| ---- | ----- |
| Listen Server | `UE4Editor.exe ProjectName MapName?Listen -game` |
| Dedicated Server | `UE4Editor.exe ProjectName MapName -server -game -log` |
| Client | `UE4Editor.exe ProjectName ServerIP -game` |
[region:note]
専用サーバーにはデフォルトでヘッダ情報がありません。「-log」を使用しないと、専用サーバーを表すウィンドウは表示されません。
[/region]
## サーバーゲームプレイのフロー
サーバーはゲームプレイフローの操作を担当します。アクタのレプリケーション更新などの情報と一緒に、ゲームプレイが開始/終了すると、クライアントにマップへ移動するタイミングを伝えるのはサーバーの仕事です。
[フレームワークの主要部分](Gameplay/Framework) のほとんどはこのドキュメントの対象外ですが、特定クラスを作業する時に導入するマルチプレイヤーの付加的なニュアンスについて触れていきましょう。
ゲームプレイステートとフローは一般的に `GameMode` アクタで操作します。サーバーだけがこのアクタの正確なコピーを格納します(クライアントはコピーを一切格納しません)。このステートをクライアントへ伝達するには `GameState アクタ` を使用します。このアクタは `GameMode` アクタの重要なステートをシャドーイングします。`GameState` アクタはそれぞれのクライアントにレプリケートするためにマークが付けられます。クライアントはこの `GameState` アクタの近似コピーを格納して、ゲームの全体的なステートを知るためにこのアクタをリファレンスとして使用します。
GameMode に関する詳説は、 [ゲームプレイオンラインマニュアル](Gameplay/Framework/GameMode) を参照してください。
## 接続プロセス
ネットワーキングの視点からサーバーがリクエストに応えるにはクライアントと接続しなくてはいけません!
新規クライアントが初めてサーバーと接続すると、いくつかのことが起こります。最初に、クライアントはサーバーへ接続リクエストを送信します。サーバーはこのリクエストを処理して、接続を拒否しない場合は処理を行う適切な情報と共にクライアントにレスポンスを送信します。
主な手順は以下の通りです。
1. クライアントは接続リクエストを送信します。
2. サーバーがリクエストを許可すると、クライアントへ現行マップを送信します。
3. サーバーはクライアントがこのマップをロードし終わるまで待ちます。
4. マップがロードされるとサーバーはローカルで `AGameMode::PreLogin` を呼び出します。
* `GameMode` はここで接続を拒否することができます。
5. 接続が許可されると、サーバーは `AGameMode::Login` を呼び出します。
* この関数は `PlayerController` を作成する役割があります。作成後は新しく接続したクライアントにこれをレプリケートします。レプリケートを受け取ると、この `PlayerController` をクライアントの一時的な `PlayerController` と置換します。一時的なコントローラーは接続をプロセス中にプレースホルダ―として使用したものです。
* `APlayerController::BeginPlay` はここで呼び出されることに留意してください。このアクタにRPCを呼び出すのはこの時点でもまだ安全ではありません。AGameMode::PostLogin が呼び出されるまで待機しなくてはいけません。
6. これまでの手順を問題なくすべて実行したと仮定して、ここで `AGameMode::PostLogin` が呼び出されます。
* サーバーはこの時点でRPC関数をこの`PlayerController` 上に安全に呼び出すことができます。