Unityで最大200人バトロワを実現するサンプル「BR200」を触ってみた　基礎編

# はじめに
BR200は、Unity社とExitGames社の2社が共同開発した、200人同時参加可能なバトルロイヤルゲームのサンプルです。
そのネットコードに使用されているのはPhoton Fusionで、ドイツのExitGames社が開発、GMOグローバルサイン・ホールディングス株式会社が日本展開を行っています。

これまでのPhoton Fusion記事では基本的な使い方を中心に紹介してきました。Fusionの強みはダイナミックな同期範囲設定やラグ補正など、バトロワ系に代表される参加人数の多いオンラインゲーム向けの機能にあります。

しかしながら、サーバーモードに対応したサンプルなど、大規模マルチプレイを開発する場合に参考にできる資料があまりありませんでした。

そんな中2022年9月、サーバーサイドも含めた完全に動作するサンプルプロジェクトが無料公開されました。それがBR200です。

[バトルロイヤルサンプルのBR200、無料提供へ – Photon](https://support.photonengine.jp/hc/ja/articles/10919371554585)

本記事では、このBR200を動作させるに当たって注意することや気づいたことについてまとめました。

ちなみに本記事では取り扱いませんが、発射体に特化したFPSサンプルや、VRChat風のオンラインコミュニケーションツールを作るサンプルなど、ユニークなものもいくつかあります。

:::note info
投稿時、マニュアル通りに設定を完了した場合、クライアントから接続する部分で問題が起こり、サーバに接続できないという問題に遭遇しました。

原因と解決方法が判明しましたので「追記」の項を加筆しました。
:::
## 前提記事

Photon Fusionの基本的な解説は別記事で行っています。詳しく知りたい方は以下のリンクからご参照下さい。

https://qiita.com/nimushiki/items/d6fe4f0cbe0437677fa8

[関連記事](https://qiita.com/tags/photonfusion)

## 動作確認環境

Windows 10 Home 21H2
Unity 2021.3.5f1
BR200 - Battle Royale Multiplayer with Photon Fusion Version 1.0.1

## BR200を試すための事前準備

BR200は無料ダウンロード可能かつ実行も可能なプロジェクトです。最低限実行するだけであれば以下の準備をすれば可能です。

- Unity 2021.3.5f1　以降を使用する
- 空プロジェクトを作成、UnityAssetStoreからBR200をインポートする
- Photonの公式サイトでの登録作業
    - 会員登録をしておく
    - ダッシュボードからBR200用のAppIDを取得して設定する
    - 完全にローカル環境で実行するだけなら不要

サーバーサイドの設定（プロジェクトのビルド、デプロイ、実行）を行う場合、以下のような様々な前提が必要となります。
- ビルドモジュールの「Linux Build Support IL2CPP」を加える（サーバーサイドのビルド用）
- Visual StudioであればVisual Studio Installerから「C++デスクトップ開発」をインストールする
- Unity Gaming Service（有料サービス）のためにクレジットカードを準備する

# BR200の使い方～基本項目

BR200は無料でもマルチプレイを試すことが可能です。本項では有料無料に関わらない、共通の基本的な項目について解説します。

## 基本的な使い方

事前準備が終わった後、Loaderシーンを開いて実行するだけで動作します。

ネットワークトポロジーについて、サーバー側の設定をしていない場合はクライアントホスト型で接続されます。なお、共有モードには恐らく対応していません。

## デバッグ用の機能

Templateシーンはデバッグ用のシーンで、シーン中にあるStandaloneManagerで設定をする事ができます。

またマルチピアモードに対応しており、効率的にマルチプレイデバッグをすることができます。Network Project ConfigでPeer ModeをMultipleに変更し任意のシーンにStandaloneManagerを設置して実行すれば、ExtraPeersに設定した数だけ自動でピアが起動します。

なお、マルチピアモードについては以下の記事で解説しています。

https://qiita.com/nimushiki/items/d683b3a17a6431f12b01

# BR200の使い方～サーバーモード編

本サンプルの最大の特徴である、Unityの有料サーバーサービスを利用したモードの紹介です。

サーバーモードはクライアントホストモードと異なり、ホストの通信環境がボトルネックにならず、チートにも強く、安定したゲームを提供することができます。

設定にあたってはインポートしたプロジェクト直下にPDFマニュアルがあり、これをなぞっていけば問題ありません。しかしマニュアルからは一部読み取りにくい部分があるため、本項にて補足します。

なお同時参加人数は初期状態では80人までとなっており、200人に対応する場合はUnityに問い合わせが必要となります。

## UGSとは

UGSとはUnity Gaming Serviceの略で、Unityが提供する様々なオンラインサービスの総称です。

https://unity.com/ja/solutions/gaming-services

BR200ではUGSのGame Server Hosting（その前提のCloud Content Delivery）とMatchmakerを利用します。前者はサーバープログラムを設置するために、後者はマッチメイキング機能を実現するために利用します。

これらのサービスは従量課金制ですが、無料枠が多く試しに動かしてみる程度なら無料枠を超えることはないと思われます。

ただし有料サービスを有効化する必要があるため、無料枠を超えないにしてもクレジットカードを登録する必要があります。

## マニュアルの補足説明

BR200プロジェクトのAssetsフォルダ直下に、PDFのマニュアル（Fusion BR200 - Multiplay Integration.pdf）が付属しています。
設定を行うにあたってはそれをなぞれば基本的に問題ありませんが、いくつか注意点があります。

### Get startedの項

本記事の前半で解説した事前準備の範囲になります。

以降はUnityの公式サイトからUGSを有効化していく手順です。
    
https://unity.com/ja/solutions/gaming-services
    
### Add the Multiplay Managerの項
UGSのうちGame Server Hostingを有効化する手順です。

- 最初に、設定したいBR200のプロジェクトを選択してSet up Multiplayをクリック、少し待ちます
- Create build configurationのGame Server Executableに設定するファイルの指定がマニュアルにありません。恐らく.x86_64を選択するのが正解と思われます

- Custom launch parametersは改行が入らないよう注意します
    - PDFからパラメータをコピペすると改行が入ってしまうので、入力欄にコピペした後改行を削除して下さい

- Custom launch parametersは　-region eu　を　-region asia　に変更する必要があります

- Create fleetのResionをAsiaにする必要があります

- Create a test allocationは多少時間がかかることがあります
    - Matchmakerの設定は並行してできるため、先にそちらを進めると良いでしょう
    - テストが成功すれば不要ですので、Deallocateをクリックし削除します

- サーバーを起動しておく必要はありません
    - 接続時に自動で立ち上がり、ゲームが終了したタイミングで終了します
  
### Add the Unity Matchmakerの項
UGSのうちMatchmakerを有効化する手順です。
設定が完了すれば、Overviewのページでトラフィックを見ることができます。

- Team Nameは適当で問題ありません
- Create a pool with filtersの設定は恐らく不要です

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

設定をする中で遭遇した問題とその解決方法をまとめました。

-  Create a test allocationの項について
    - Test allocation Successful表示がでないことがある
        - Waiting for serverのままだが別タブで開くとAllocatedになってる
        - リロードすれば正常な表示になる
    - Test allocationsのClear,Deallocateが効かないことがある
        - リロードすると復活する

- Server instancesがAllocatedになったまま作業ができない時の対処
    - 一旦stopした後、startをすることでAvailableになります
- ビルド上げ直すときの手順
    - Fleetsを止める
        - Scaling settingsタブの鉛筆マークからOfflineにする
        - Serversから項目が消えるのを確認（少し待つ）
    - FLeetsを消す
    - Build Configurationsを消す
    - Buildsを消す
    - 必要であればUnityで再度ビルドし、マニュアルをCreate a buildの項からやり直す
    - MatchmakerのQueues > Pools > Fleet,Build configurationを修正する
![Matchmakerの設定箇所](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2576800/dcea2760-d1b2-7f89-13c3-fcba3143d923.png)

# 追記
マニュアル通りに設定を完了した場合、クライアントがサーバーに接続できない問題が起こります。
日本で作業することを前提とした場合、以下の通り変更する必要があります。（「Get startedの項」に追記した内容と同じ）

- Custom launch parameters　は　-region eu　を　-region asia　に変更する

- Create fleetのResionをAsiaにする

- ゲーム開始後、メニューのRegionを（Japanではなく）Asiaにする

なお、UnityEditor上でサーバーの設定ができそうな部分（PhotonAppSettingsなど）がありますが、マニュアルに書いていない部分で設定する項目はありません。


# まとめ

UGSでの設定がやや多かったり、クレジットカードが必須であったりと多少手間がかかる印象です。

しかし個人でもこの規模のゲームを無料で動かしてテストできるのは良いと思いました。さらにゲーム自体もしっかり作られており、実装や設定についても参考になります。

またゲームの拡張、キャラクターモデルの差し替えや武器の追加、ステージの改変などについては今後試して記事にする予定です。