Photon Fusion 動作確認 ヨシ!
はじめに
この記事は、主にPhoton Fusionで開発したオンラインゲームの動作確認やテストを行う際に、知っておくと良い基本的な事項を簡潔にまとめたものになります。
動作確認方法
シングルプレイ(1人用)のゲームは、Unityのエディタでゲームを再生するだけ動作確認することができますが、マルチプレイのゲームでは、複数のプレイヤーのマッチメイキングやゲームを正常に同期できるかを確認するため、複数のゲームを起動・再生できるようにする必要があります。ここでは、そのマルチプレイのゲームの動作を確認する方法をいくつか紹介します。
1. Unityでビルドする
ゲームの動作を確認する基本的な方法で、ビルドしたゲームを複数起動すればマルチプレイのゲームの動作確認も可能になります。ただしビルドには時間がかかるので、動作確認を行うたびにビルドが完了するまでの待ち時間が発生するというのが、非常に大きな欠点となります。
スタンドアロン(Windows, Mac, Linux)ビルドは、ビルド時間が比較的短く、実行ファイルの配布も簡単なので、開発中のテストをお手軽に行う際には役立つでしょう。
2. ParrelSyncを使用する
ParrelSyncというエディタ拡張を導入すると、一つのUnityプロジェクトを複数のUnityエディタで開くことができるようになります。これによって、ビルドする手間をかけることなく、複数のUnityエディタでゲームを再生して、マルチプレイの動作確認をすることが可能になります。
インストール手順
PackageManagerで、左上の➕ボタンから「Install package from git URL」を選択した後、以下のURLを指定して、インストールを開始してください。
https://github.com/VeriorPies/ParrelSync.git?path=/ParrelSync
正常にインストールが完了すると、PackageManagerに「ParrelSync」が表示されるようになります。
基本的な使い方
メニューバーの「ParrelSync > Clones Manager」から、Clones Managerのウインドウを開きましょう。
「Create new clone」ボタンを押すと、Unityプロジェクトのクローン(複製)が作成されます。クローンが完了するまでには時間がかかるので少し待つ必要があります。
Unityプロジェクトのクローンが作成されると、そのクローンを「Open in New Editor」から別のUnityエディタで開くことができるようになります。
3. Fusionのマルチピアモードを使用する
Fusionのマルチピアモード(Multi-peer Mode)は、一つのゲームの中で複数のピア(ホスト・クライアント)を実行できるようになる機能です。この機能を活用してネットワークへの接続処理を実装すると、一つのUnityエディタ上でマルチプレイの動作確認ができるようになります。
基本的な使い方
NetworkProjectConfig
のPeer Mode
をMultiple
にして、マルチピアモードを有効にすると、複数のピアを実行できるようになります。ここから、複数のNetworkRunner
インスタンスを生成して、NetworkRunner.StartGame()
を呼び出す実装を行いましょう。
デフォルトでは、全てのピアのシーンに存在するゲームオブジェクトが、一つの画面に重なって表示されてしまうため、適切に各ピアの表示/非表示を切り替られるようにする必要があります。
Runner Visibility Controls
メニューバーの「Fusion > Windows > Runner Visibility Controls」から、Runner Visibility Controlsのウインドウを開きましょう。
このRunner Visibility Controlsウインドウから、各ピアの表示/非表示の切り替え(👁️)、各ピアの入力の有効/無効の切り替え(🎮️)などを行うことができます。
Runner Visibility Nodes
RunnerVisibilityNodes
コンポーネントは、Components
リスト内の各コンポーネントが二つ以上有効にならないように自動的に制限してくれます。マルチピアモードではピアの数だけ同じシーンが読み込まれますが、そのシーンにAudioListener
やEventSystem
などのゲーム中に一つしか存在してはいけないコンポーネントが含まれていても、安全に動作させることができるようになります。
実装サンプル
ここでは、マルチピアモードの最小の実装サンプルを作成してみましょう。以下の画像を参考に「RootScene」と「GameScene」の二つのシーンを作成してください。
RootSceneのスクリプト(GameLauncher
)では、4プレイヤー分のNetworkRunner
インスタンスを生成して、それぞれネットワークへの接続処理を行います。
using Fusion;
using UnityEngine;
using UnityEngine.SceneManagement;
public class GameLauncher : MonoBehaviour
{
[SerializeField]
private NetworkRunner networkRunnerPrefab;
private async void Start() {
// GameSceneをアクティブなシーンにする
SceneManager.SetActiveScene(SceneManager.GetSceneByName("GameScene"));
for (int i = 0; i < 4; i++) {
// 各NetworkRunnerの接続処理を行う
var runner = Instantiate(networkRunnerPrefab);
var result = await runner.StartGame(new StartGameArgs {
GameMode = GameMode.AutoHostOrClient,
Scene = SceneManager.GetActiveScene().buildIndex,
SceneManager = runner.GetComponent<NetworkSceneManagerDefault>()
});
// 各NetworkRunnerのゲームオブジェクトの名前を変更して識別しやすくする
if (result.Ok) {
runner.name = (runner.IsServer) ? "Host" : $"Client {runner.LocalPlayer.PlayerId}";
}
}
}
}
GameSceneでは、RunnerVisibilityNodes
コンポーネントを追加したゲームオブジェクトを最上位の親にして、シーン内の全てのコンポーネントの表示/非表示の制御を一括管理させましょう。インスペクター上の「Find in Nested Children」を押すと、子オブジェクトの適切なコンポーネントが自動的にRunnerVisibilityNodes
のComponents
リストに追加されます。
Unityエディタ上でゲームを再生して、プレイヤー数の分だけ独立したGameSceneが動作することを確認しましょう。
4. UnityのMultiplayer Play Modeを使用する
Unity 2023.1以降では、Unity公式のMultiplayer Play Modeパッケージをインストールすることで、Unityエディタ上で複数のゲームを再生することができるようになります。
インストール手順
PackageManagerの左上の➕ボタンから「Install package by name」を選択した後、以下のパッケージ名を指定して、インストールを開始してください。
com.unity.multiplayer.playmode
正常にインストールが完了すると、PackageManagerに「Multiplayer Play Mode」が表示されるようになります。
基本的な使い方
メニューバーの「Window > Multiplayer Play Mode」から、Multiplayer Play Modeのウインドウを開きましょう。
各プレイヤーの左側のチェックボックスをオンにすることで、(Unityエディタ自体を含む)最大4人分のプレイヤーを有効にできます。プレイヤーを有効にするには少し時間がかかるので、プレイヤーのステータスがActiveに変わるまで待ちましょう。
プレイヤーを有効にした後、Unityエディタでゲームを再生すると、自動的に有効にした分のプレイヤーの別ウインドウが立ち上がるようになります。
「Player 2」が別ウインドウで開いている状態
計測ツール
動作確認では、ゲームにバグが無いかの確認はもちろんのこと、ゲームで十分なパフォーマンスが出せているかの確認も重要です。Unityのプロファイラーでは、CPUやメモリの使用率、描画やオーディオや物理演算の負荷など、様々なパフォーマンスを計測することが可能ですが、ネットワーク周りの情報やパフォーマンスを詳細に計測することはできません。ここでは、そのネットワーク周りのパフォーマンスを計測するためのツールをいくつか紹介します。
FusionStats
Fusionには、ネットワーク状態を監視・収集してUIに表示するFusionStats
コンポーネントが用意されています。これを使って、RTT(Round Trip Time:クライアント/サーバー間の通信にかかる往復の時間)や、通信量(送受信パケットサイズ)など、ネットワーク周りのデバッグやパフォーマンスの最適化に役立つ情報をリアルタイムに計測することができます。
基本的な使い方
メニューバーの「Fusion > Add Fusion Stats」を実行すると、アクティブなシーン上にFusionStats
のゲームオブジェクトが追加されます。
ゲームを再生すると、リアルタイムにネットワーク周りの統計情報が確認できます。
Network Conditions
オンラインゲーム開発中は、比較的性能の良いPCと安定したネットワーク環境でのみ動作確認を行ってしまいがちです。しかし対象プラットフォームによって、低速な回線や、不安定なWi-Fi接続など、必ずしも良環境とは言えないネットワーク状態でゲームがプレイされることも想定しなければならないことがあるでしょう。Fusionには、悪環境下のネットワーク状態をシミュレーションする機能が組み込まれているので、様々なネットワーク環境のプレイヤーから実際にはどのようにゲームが同期されて見えるのかを再現して確認することができます。
基本的な使い方
Network Conditionsを使用するには、Fusionをデバッグ版のDLLに切り替える必要があります。メニューバーの「Fusion > Toggle Debug Dlls」を実行するたびに、通常のリリース版DLLとデバッグ版DLLが交互に切り替わるようになっているので、ここでデバッグ版に変更しましょう。
NetworkProjectConfig
のFusion Version
から、デバッグ版のDLLになっていることを確認しましょう。デバッグ版になっていれば、Network Conditions
が表示されているはずです。
ここでEnabled
にチェックを入れると、人工的な遅延(Delay)とパケットロス(Loss)の設定が有効になり、悪環境下のネットワーク状態をシミュレーションすることができます。
Wireshark
Wiresharkは、ネットワークの生のパケットをキャプチャ(取得)して、詳細に解析することができるパケットキャプチャツールです。無料のオープンソースソフトウェアで、以下の公式サイトからダウンロード・インストールして、簡単に使い始めることができます。
基本的な使い方
Wiresharkを起動した後、オンラインゲームの通信で利用しているネットワークインターフェースを選択して、ダブルクリックすることでキャプチャを開始することができます。
キャプチャ開始時に特に何も設定していなければ、オンラインゲームの通信とは関係のないパケットも全てリストに表示されてしまうので、ここではWiresharkの「表示フィルタ」機能を使って表示を絞り込みましょう。以下のリンクから、Photonが使用するプロトコルとポート番号が確認できるので、適切なフィルタ(PhotonAppSettings
などの設定によって変わります)を記述して、右側の「表示フィルタを適用」ボタン(➡)からフィルタを適用しましょう。
正しくフィルタが適用できると、オンラインゲームの通信に関係するパケットのみがリストに表示されるようになります。
チェック項目
動作確認で何をチェックするのか?は、ゲームの内容によって大きく異なりますが、オンラインゲーム開発の初心者が実装と確認を怠ってしまいがちな基本的な項目の一つとして、「プレイヤー数が増減した際の処理」があります。ここでは、いくつかの代表的なオンラインゲームの参加型の例から、主にオンラインゲーム開発初心者が気を付けるべきチェック項目を示します。
1vs1 対戦プレイ
✅ ゲームプレイ中に、どちらかのプレイヤーがセッションから退出したら、正常にゲームが終了するか?
✅ その際、セッションに残っているプレイヤーの勝利判定になるか?
✅ その際、セッションから退出したプレイヤーの敗北判定になるか?
個人対戦プレイ(バトルロイヤル)
✅ ゲームプレイ中に、プレイヤーの1人がセッションから退出しても、残りプレイヤー数が2人以上なら、正常にゲームの進行が継続するか?
✅ ゲームプレイ中に、プレイヤーの1人がセッションから退出して、ゲームの終了条件が満たされたら、正常にゲームが終了するか?
✅ ゲームプレイ中に、プレイヤーの1人がセッションから退出して、残りプレイヤー数が1人になったら、正常にゲームが終了するか?
✅ (途中参加可能なら)途中参加したプレイヤーは、ゲームの状態が正常に同期されるか?
チーム対戦プレイ
✅ ゲームプレイ開始時に、各プレイヤーは、適切なチームに割り当てられるか?(例えば、チームの人数に偏りがない・チームの実力が拮抗する振り分けが行われるかなど)
✅ ゲームプレイ中に、プレイヤーの1人がセッションから退出しても、そのチームの残りプレイヤー数が1人以上なら、正常にゲームの進行が継続するか?
✅ ゲームプレイ中に、プレイヤーの1人がセッションから退出して、ゲームの終了条件が満たされたら、正常にゲームが終了するか?
✅ ゲームプレイ中に、プレイヤーの1人がセッションから退出して、そのチームの残りプレイヤー数が0人になったら、チームの敗北判定になるか?あるいは正常にゲームが終了するか?
✅ (途中参加可能なら)途中参加したプレイヤーは、ゲームの状態が正常に同期されるか?
✅ (途中参加可能なら)途中参加したプレイヤーは、適切なチームに割り当てられるか?(例えば、プレイヤー数が少ない側のチーム・スコアが負けている側のチームなど)
Discussion
こちらの情報は探しても見つからなかったのですが、どこかに出典はありますか?
メッセージ数制限が撤廃されたこと自体の告知はされていない感じですね……。
公式サイトからは、既にピア数やメッセージ数の制限の表記は完全に削除されてます。 (この辺りしれっと変更されているのですが、結構大きなニュースと感じる開発者の方は多いと思うので、今後も周知を広めていきたい所です)
ありがとうございます。ちょうど困っていたので助かります!