> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# ゲーム サーバーのローカル デバッグと PlayFab との統合

> PlayFab マルチプレイヤー ゲーム サーバーを PlayFab Game Server SDK (GSDK) と統合し、統合を検証してデバッグする方法について説明します。

## 概要

PlayFab マルチプレイヤー ゲーム サーバーには、[PlayFab Game Server SDK (GSDK)](/services/playfab/multiplayer/servers/integrating-game-servers-with-gsdk) との統合が必要です。加えて、ゲーム サーバーは PlayFab Multiplayer プラットフォーム上でコンテナー化されたアプリケーションとして実行されます。

コンテナー化されたアプリケーションとして実行することで、Azure の PlayFab プラットフォームと一致する環境でサーバーをローカルに実行およびデバッグできます。これにより、開発の反復が高速化されます。この記事では、PlayFab ゲーム サーバーがプラットフォームの要件に準拠していることを確認するのに役立ちます。

PlayFab のローカル デバッグ ツールセットには、GSDK にモック レスポンスを提供し、ゲーム サーバーが GSDK と正しく統合されているかどうかを検証する [LocalMultiplayerAgent](https://github.com/PlayFab/MpsAgent) が含まれています。モック レスポンスを使用して、VmAgent は PlayFab Multiplayer プラットフォームのライフサイクルにおけるさまざまな状態を通じてゲーム サーバーを循環させます。

エージェントを構成して、ゲーム サーバーをコンテナー化されたアプリケーションとして実行できます。ゲーム サーバーが必要なすべての依存関係でパッケージ化されており、PlayFab Multiplayer プラットフォーム上で問題なく実行されることを確認します。LocalMultiplayerAgent は、Windows または Linux ゲーム サーバーのいずれとも動作します。

## 基本的なセットアップ - Windows

* ゲーム サーバーを GSDK と統合してビルドします。詳細については、[PlayFab Game Server SDK (GSDK) を使用したゲーム サーバーの統合](/services/playfab/multiplayer/servers/integrating-game-servers-with-gsdk) を参照してください。
* ゲーム サーバーとその依存関係を zip アーカイブに圧縮します。コンテナー モードで正しく実行するには、zip アーカイブにはコンテナー イメージに含まれていないシステム DLL が含まれている必要があります。詳細については、[必要なシステム DLL の判別](/services/playfab/multiplayer/servers/determining-required-dlls) を参照してください。

<Note>
  よくあるミスを避けてください - zip 内のフォルダーの *中に* フォルダーを誤って zip しないでください。zip 後、zip フォルダーを参照し、圧縮ソフトウェアがファイル階層の追加のレイヤーを追加していないことを再確認してください。
</Note>

* [ローカル デバッグ ツールセット](https://github.com/PlayFab/MpsAgent/releases) をダウンロードし、任意のフォルダー (*C:\PlayFabVmAgent* など) に抽出します。

* [LocalMultiplayerAgent MultiplayerSettings.json Generator](https://github.com/PlayFab/MpsAgent/tree/main/LocalMultiplayerAgent/SettingsJsonGenerator) の json ファイルを確認しつつ、以下のオプションについて詳細を読んでください。

* 抽出したフォルダーの場所に移動し、テキスト エディター ([Visual Studio Code](https://code.visualstudio.com/download) など) で *MultiplayerSettings.json* ファイルを開きます。以下のプロパティを更新します:
  * `LocalFilePath` - 先ほど作成したゲーム サーバー アセット zip ファイルへの (ワークステーション上の) 完全なローカル パス。例: *D:\\\MyAmazingGame\\\asset.zip* (JSON 形式のためバックスラッシュはエスケープする必要があります)。
  * `StartGameCommand` - コンテナー内のゲーム サーバー実行可能ファイルへのフル パス。たとえば、実行可能ファイル名が *mygame.exe* の場合、サンプル パスは *C:\\\Assets\\\mygame.exe* です。StartGameCommand のパスは、プロセスとコンテナーで異なります。コンテナーの StartGameCommand パスは、コンテナーまたはアセット フォルダー内のリソースへの絶対パスです。プロセスの StartGameCommand パスは、最初に指定されたアセットが作業ディレクトリとなる相対パスです。
  * `PortMappingsList` - これらは実行中のゲームに利用可能なポートです。`NodePort` はワークステーション上で開かれるポートで、`GamePort.Number` はコンテナー内で実行時にゲーム サーバーがバインドする必要があるポートです。ゲーム サーバーがクライアントをリッスンしているプロトコルとポートに合わせて GamePort セクションを更新します。ゲーム サーバーが複数のポートを必要とする場合、既存のポート構成をコピー/ペーストし、`NodePort` をインクリメントしてから、`GamePort.Number` および `GamePort.Name` を必要なポートに更新します。プロセスとして実行する場合、`GamePort.Number` は無視され、プロセスは NodePort にバインドする必要があります。両方のケースを処理するには、次のいずれかを実行してください:
    * ポートを同じ値に設定する
    * 実行時にキー `GamePort.Name` の値を GSDK config で確認します。これは常にバインドすべき正しいポートを返します。

* *MultiplayerSettings.json* ファイルには、編集したい追加のフィールドがあります:
  * `ResourceLimits` (省略可) - 指定した場合、docker が CPU/メモリ使用量を制限します。警告: サーバーが許可されたメモリを超えると、強制終了されます。ResourceLimits はコンテナー モードでのみ指定できます。
  * `SessionCookie` (省略可) - [RequestMultiplayerServer API](xref:titleid.playfabapi.com.multiplayer.multiplayerserver.requestmultiplayerserver) 呼び出しの一部としてゲーム サーバーに渡されるセッション クッキー。
  * `OutputFolder` (省略可) - 出力および構成ファイルが生成されるドライブまたはフォルダーへの絶対パス。ゲーム サーバーがこのパスの下に抽出されるため、十分なスペースがあることを確認してください。指定しない場合、エージェント フォルダーが使用されます。
  * `MountPath` - アセットをマウントするコンテナー内のパス。プロセス モードで実行する場合はこのフィールドを指定する必要はありません。サンプル値の *C:\\\Assets* を使用することをお勧めします (JSON 形式のためバックスラッシュはエスケープする必要があります)。
  * `AgentListeningPort` - ゲーム サーバーと通信するためにエージェントがバインドするポートを指定します。任意の開いているポートで動作します。56001 にバインドしている別のプロセスがある場合、この値を変更する必要があります (または他のプロセスを終了してください)。

## GSDK 統合の検証

* *MultiplayerSettings.json* ファイルで、`RunContainer` を `false` に設定します。
* PowerShell ウィンドウ (管理者として):
  * ツールセットを抽出したフォルダーに作業ディレクトリを変更します。
  * *LocalMultiplayerAgent.exe* を実行します。この時点で、**LocalMultiplayerAgent** は http リスナーをセットアップし、ゲーム アセットを解凍し、別のプロセスでゲーム サーバーを起動します。次に、**LocalMultiplayerAgent** はゲーム サーバーと統合された GSDK からのハートビートを待機します。
* GSDK が正しく統合されている場合、**LocalMultiplayerAgent** は次の出力を表示します:
  * `CurrentGameState - Initializing` (これは省略可能で、ゲーム サーバーが直接 `GSDK::ReadyForPlayers` を呼び出して `GSDK::Start` を呼び出さない場合は表示されないことがあります)
  * `CurrentGameState - StandingBy`
  * `CurrentGameState - Active`
  * `CurrentGameState - Terminating`
* シャットダウン コールバックが正しく設定されている場合、状態が terminating に設定された直後にゲーム サーバーが終了します。PlayFab プラットフォーム上での非正常なシャットダウンを避けるため、ゲーム サーバーが確実に終了することを確認することが重要です。
* **LocalMultiplayerAgent** もゲームと共に終了する必要があります。

### ゲームへの接続のテスト

ゲーム サーバー実行可能ファイルが実行中で、**LocalMultiplayerAgent** が `CurrentGameState - Active` を出力する場合、ゲーム サーバーが listen している IP アドレス **127.0.0.1** とポート `NodePort` を使用してゲーム サーバーに接続できます。

`NumHeartBeatsForActivateResponse` 回のハートビートの後、**LocalMultiplayerAgent** はゲーム サーバーを standby から active に移行するようリクエストします。次に `NumHeartBeatsForTerminateResponse` 回のハートビートの後、**LocalMultiplayerAgent** はゲーム サーバーを active から terminated に移行するようリクエストします。この動作は、*MultiplayerSettings.json* ファイル内の値を更新することで調整できます。

## コンテナー化の検証

コンテナーの世界に不慣れな場合は、[こちら](https://learn.microsoft.com/en-us/dotnet/architecture/microservices/container-docker-introduction/) で入門を確認できます。

### 前提条件

* April 2018 (1803) 更新プログラム付きの Windows 10 Pro (以上)。
* [Docker](https://download.docker.com/win/stable/Docker%20for%20Windows%20Installer.exe) をダウンロードします。または、[Docker の Web サイト](https://www.docker.com/products/docker-desktop) のメイン ページからダウンロードできます。

### セットアップ

* Docker が [Windows Containers を使用する](https://docs.docker.com/docker-for-windows/#switch-between-windows-and-linux-containers) ように設定されていることを確認します
* PowerShell ウィンドウ (管理者として):
  * ツールセットが抽出されたフォルダーに移動します。
  * *Setup.ps1* を実行します。このスクリプトは、docker ネットワークをセットアップし、**LocalMultiplayerAgent** と通信するためのファイアウォール ルールを追加し、[Microsoft/PlayFab-Multiplayer](https://hub.docker.com/r/microsoft/playfab-multiplayer/) から PlayFab docker イメージをプルします。スクリプトが初回実行される際、コンテナー イメージのダウンロードに数分かかることがあります。

<Note>
  このセットアップを正常に実行するには、インストールされているサードパーティのアンチウイルス プログラム (McAfee、Norton、Avira など) のファイアウォールを構成する必要がある場合があります。
</Note>

### コンテナー内でゲーム サーバーを実行する

* *MultiplayerSettings.json* ファイルで、`RunContainer` を `true` に設定します。
* ツールセットが抽出されたフォルダー (*C:\PlayFabVmAgent*) で **PowerShell** ウィンドウ (管理者として) を開き、`LocalMultiplayerAgent.exe` を実行します。これでコンテナー内でゲーム サーバーが起動します。最終的に、PowerShell ウィンドウでゲーム状態変化の出力が表示されるはずです (上記の GSDK 統合の検証セクションと同様)。

### コンテナー内で実行されているゲーム サーバーへの接続のテスト

**LocalMultiplayerAgent** の出力が `CurrentGameState - Active` を出力する場合、*MultiplayerSettings.json* ファイルで指定されている `NodePort` (デフォルトでは **56100**) と IP アドレス **127.0.0.1** を使用してゲーム サーバーに接続します。

`NumHeartBeatsForActivateResponse` 回のハートビートの後、**LocalMultiplayerAgent** はゲーム サーバーを standby から active に移行するようリクエストします。次に `NumHeartBeatsForTerminateResponse` 回のハートビートの後、**LocalMultiplayerAgent** はゲーム サーバーを active から terminated に移行するようリクエストします。この動作は、*MultiplayerSettings.json* ファイル内の値を更新することで調整できます。

### LocalMultiplayerAgent を Linux Containers で使用する

[Docker for Windows](https://docs.docker.com/docker-for-windows/) を使用して Windows 上でコンテナー内で実行することにより、LocalMultiplayerAgent を使用して Linux ゲーム サーバーをデバッグできます。Windows 上での Linux コンテナーの実行に関する詳細については、[こちら](https://learn.microsoft.com/en-us/virtualization/windowscontainers/deploy-containers/linux-containers) を参照してください。要は、エージェントを *-lcow* パラメーターで実行し、*LocalMultiplayerSettings.json* ファイルを適切に構成する必要があります。

Windows 上でコンテナー化された Linux ゲーム サーバーを実行するには、以下の手順を実行する必要があります:

* GitHub 上の [Releases](https://github.com/PlayFab/MpsAgent/releases) ページから最新版の LocalMultiplayerAgent をダウンロードします
* [Windows に Docker Desktop をインストール](https://docs.docker.com/docker-for-windows/install/) します
* [Linux Containers](https://docs.docker.com/docker-for-windows/#switch-between-windows-and-linux-containers) で実行していることを確認します
* ハード ドライブの 1 つをマウントする必要があります。手順は [こちら](https://docs.docker.com/docker-for-windows/#file-sharing) にあります
* ゲーム サーバー イメージはコンテナー レジストリに公開するか、ローカルでビルドできます。
* "PlayFab" という Docker ネットワークを作成する `SetupLinuxContainersOnWindows.ps1` PowerShell ファイルを実行します
* *LocalMultiplayerSettings.json* ファイルを適切に構成します。以下は、`MultiplayerSettingsLinuxContainersOnWindowsSample.json` に含まれているサンプルです:

```json theme={null}
{
    "RunContainer": true,
    "OutputFolder": "C:\\output\\UnityServerLinux",
    "NumHeartBeatsForActivateResponse": 10,
    "NumHeartBeatsForTerminateResponse": 60,
    "TitleId": "",
    "BuildId": "00000000-0000-0000-0000-000000000000",
    "Region": "WestUs",
    "AgentListeningPort": 56001,
    "ContainerStartParameters": {
        "ImageDetails": {
            "Registry": "mydockerregistry.io",
            "ImageName": "mygame",
            "ImageTag": "0.1",
            "Username": "",
            "Password": ""
        }
    },
    "PortMappingsList": [
        [
            {
                "NodePort": 56100,
                "GamePort": {
                    "Name": "game_port",
                    "Number": 7777,
                    "Protocol": "TCP"
                }
            }
        ]
    ],
    "SessionConfig": {
        "SessionId": "ba67d671-512a-4e7d-a38c-2329ce181946",
        "SessionCookie": null,
        "InitialPlayers": [ "Player1", "Player2" ]
    }
}
```

<Note>
  いくつかの注意点: 1. 次を設定する必要があります
</Note>

`RunContainer` を true に設定します。これは Linux ゲーム サーバーに必要です。

<Note>
  2. 変更してください
</Note>

`imageDetails` をゲーム サーバー docker イメージの詳細で。イメージはローカルで ([docker build](https://docs.docker.com/engine/reference/commandline/build/) コマンドを使用して) ビルドするか、リモート コンテナー レジストリでホストできます。

<Note>
  3.
</Note>

`StartGameCommand` および `AssetDetails` はオプションです。すべてのゲーム アセット + ゲーム サーバー起動コマンドは対応する [Dockerfile](https://docs.docker.com/engine/reference/builder/) にパッケージ化できるため、通常 Docker コンテナーを使用するときはこれらを使用しません。

<Note>
  4. 最後に、しかし決して最少ではありません、次に注意してください
</Note>

`OutputFolder` 変数の大文字と小文字に注意してください。Linux コンテナーは大文字と小文字を区別します。大文字と小文字が正しくない場合、*error while creating mount source path '/host\_mnt/c/output/UnityServerLinux/PlayFabVmAgentOutput/2020-01-30T12-47-09/GameLogs/a94cfbb5-95a4-480f-a4af-749c2d9cf04b': mkdir /host\_mnt/c/output: file exists* のような Docker 例外が発生することがあります

* 前の手順をすべて実行した後、コマンド `LocalMultiplayerAgent.exe -lcow` で LocalMultiPlayerAgent を実行できます (lcow は *Linux Containers On Windows* の略です)

### トラブルシューティング

* コンテナー モードで、ゲーム サーバーが「Container ... exited with exit code 1」のようなエラーで即座に終了するがプロセス モードでは正常に動作する場合。アセット パッケージに必要なすべての [システム DLL](/services/playfab/multiplayer/servers/determining-required-dlls) が含まれていることを確認してください。
* すべてのログは、*MultiplayerSettings.json* ファイルで指定された `OutputFolder` の下にあります。**LocalMultiplayerAgent** は開始時に、タイムスタンプをフォルダー名として新しいフォルダーを作成します。GSDK を通じて発行されるすべてのゲーム サーバー ログは GameLogs フォルダー内にあります。
  ゲーム サーバーがコンテナー内で実行されている場合、追加のディレクトリ階層をふるいにかける必要があるかもしれません。
* GSDK は GameLogs フォルダーにデバッグ ログを書き込みます。これらのログはゲーム サーバーが出力するログと共に GameLogs フォルダー内にあります。
* ファイアウォール (Windows および他のアンチウイルス) がポート上のトラフィックを許可するように構成されていることを確認します。
* 次のようなエラーが発生した場合: `Docker API responded with status code=InternalServerError, response={"message":"failed to create endpoint <container_name> on network playfab: hnsCall failed in Win32: The specified port already exists"。指定されたポートで既にコンテナーが実行されている可能性があります。` これは **LocalMultiplayerAgent** が早期に終了した場合に発生することがあります。`docker ps` コマンドで実行中のコンテナーを見つけ、`docker kill <container_name>` で終了します。
* `Failed to find network 'playfab'` を含むエラーが発生した場合。*Setup.ps1* を再実行してみてください
* `Unhandled Exception` エラーが発生した場合、管理者として PowerShell を実行している可能性があります。
* `OutputFolder` は他のシステム変数によって使用される可能性があるため、絶対パスを使用していることを確認してください。たとえば、GSDK\_CONFIG\_FILE にはそのような依存関係があるため、ここで相対パス (または不正な値) を使用するとゲーム サーバー構成の読み込みエラーが発生することがあります。

### 既知の制限事項

1. デバッグの終了時にコンテナーが終了しないことがあります。この場合、以下の PowerShell コマンドを管理者として実行してください。これらのコマンドは、**LocalMultiplayerAgent** で開始されていないものも含め、すべてのコンテナーを停止して削除します。

```powershell theme={null}
docker stop $(docker ps -aq)
docker rm $(docker ps -aq)  
```


## Related topics

- [PlayFab ゲーム サーバーの基本](/ja-jp/services/playfab/multiplayer/servers/basics-of-a-playfab-game-server.md)
- [Wrapper サンプル](/ja-jp/services/playfab/multiplayer/servers/wrapper-sample.md)
- [ゲーム サーバー ビルドの作成](/ja-jp/services/playfab/multiplayer/servers/author-a-game-server-build.md)
- [ゲーム サーバーをデバッグするための直接接続](/ja-jp/services/playfab/multiplayer/servers/directly-debugging-game-servers.md)
- [LocalMultiplayerAgent を使用したプロセスベースのゲームサーバーのデバッグ](/ja-jp/services/playfab/multiplayer/servers/LocalMultiplayerAgent/run-process-based-gameserver.md)
