接続切断とクイック再接続
機能の概要
Fusion 2.0.5から、Photon Cloudとの接続切断をより適切に処理し、自動的にセッションへ再参加する機能が導入されました。この機能によって、ネットワーク切断処理が改善され、Photon Cloud関連の接続問題に対するアプリケーションの挙動をより細かく制御できます。デフォルトで、ピアは最大5回までPhoton Cloudへの再接続を試行し、5回の試行がすべて失敗すると、設定(詳細は後述)に応じて、ピアは接続を切断するか別のセッションへ移動します。
Fusion2.1ではさらにこの挙動を拡張して、クイック再接続が不可能な場合、サーバーがセッションとクライアントを別のルームへ移動できるようになります。これによって、Fusionサーバーの全体的な安定性が向上し、深刻な問題が発生したケースでも稼働が維持されます。
この機能はホストモードのみに適用されるため、影響を受けるのはHost・Server・Clientモードのみです。共有モードはサポートされません。
API
概要
自動再接続の内部的な挙動に加えて、新しいコールバックNetworkRunner.CloudConnectionLostも導入されました。このコールバックは、ピアが同じGame Sessionへの自動再接続を試行するたびに呼び出され、そこで接続状態に基づいた独自の動作を実装できるようになっています。
C#
NetworkRunner.CloudConnectionLost += (NetworkRunner runner, ShutdownReason reason, bool reconnecting) => { ... };
runner:NetworkRunnerインスタンスの参照reason:接続が切断された理由を表すShutdownReasonreconnecting:セッションへ再接続中かどうかを示すフラグ
Fusion 2.1以降で利用可能になっているNetworkRunner.CloudConnectionLostCurrentModeフィールドから、挙動を設定することも可能です。設定可能なモードは次の通りです。
CloudConnectionLostMode.Disabled:機能を完全に無効にするCloudConnectionLostMode.QuickRejoin:クイック再参加のみを有効にするCloudConnectionLostMode.MoveSessionToNewRoom:クイック再参加に加えて、サーバーによって別ルームに移動する機能も有効にする
呼び出される条件
主に2つの状況で、コールバックが呼び出されます。
- Photon Cloudのタイムアウト:Photon Cloudのタイムアウトによって切断が発生した場合、コールバックは
ShutdownReason.PhotonCloudTimeoutを受け取ります。 - セッションの終了:再参加の試行が成功する前にセッションが終了した場合、コールバックは
ShutdownReason.GameNotFoundを受け取ります。
クライアントの挙動
この機能が有効な場合、ピアはPhoton Cloudとの接続を失っても自動的にシャットダウンせずに、自動的にセッションへの再参加を試みます。
コールバックを実装することで、例えば、再接続処理が進行中でまもなくゲームが再開されることをプレイヤーに通知することができます。
サーバーの挙動
クイック再参加のみ有効時
Fusion 2.0.5以降でのみ有効なオプションです。
サーバーがPhoton Cloudとの接続を失い、再接続試行(上記のクライアントの挙動と同様)後も再参加できなかった場合:
- Fusionプラグインは、自動的にセッションを非表示かつ参加不可能に設定します。
- 新規クライアントは、セッションへ参加できなくなります。
- 既存の直接接続しているクライアントは、接続を維持し、通常通りにプレイを継続します。
これによって、サーバーがPhoton Cloudとの接続を失った場合でも、サーバーは稼働を継続し、既存プレイヤーのGame Sessionのアクティブ状態が維持されます。
セッションを新規ルームへ移動
Fusion 2.1.0以降でのみ利用可能で、デフォルトで有効になります。
サーバーがPhoton Cloudとの接続を失った場合、まず上記のようにクイック再参加が試行されます。
それが失敗した場合、セッションを新規ルームへ移動させます。
- 新しいセッションIDを生成(現在のセッションIDに基づくか、
StartGameArgs.SessionNameGeneratorを呼び出す)します。他のセッションとの衝突を避けるため、末尾に[bpk-<6 long random digits>]を追加します。セッションIDは最大200文字のため、この制限を超える場合は自動的に切り詰められます。 - 生成されたIDから新しいセッションを作成し、非表示に設定します。
- すべての直接接続しているクライアントに、別セッションへ接続するように通知します。
- クライアントの再接続を最大10秒待ちます。
- セッションを表示に戻して、他のクライアントが参加できるようにします。
セッション移動中もGame Sessionは通常通りに継続され、移動後もルームはマッチメイキング対象になります。
実装例
Cloud接続切断機能の基本的な実装は次の通りです。
C#
public class NetworkRunnerCloudConnectionLost : MonoBehaviour
{
private void Start()
{
// Fusion 2.1.0以降でのみ有効
// Cloud接続切断モードの設定
// CloudConnectionLostMode.MoveSessionToNewRoomがデフォルト値
NetworkRunner.CloudConnectionLostCurrentMode = NetworkRunner.CloudConnectionLostMode.MoveSessionToNewRoom;
// Fusion 2.0.5以降、2.1.0以降で有効
NetworkRunner.CloudConnectionLost += OnCloudConnectionLost;
}
private void OnCloudConnectionLost(NetworkRunner runner, ShutdownReason reason, bool reconnecting)
{
if (reconnecting)
{
// 例:ゲームへの再接続をプレイヤーに通知
Debug.Log($"Cloud Connection Lost: {reason}, reconnecting...");
// 自動的な再接続が完了するまで待つ
StartCoroutine(WaitForReconnection(runner));
}
else
{
Debug.Log($"Cloud Connection Lost: {reason}.");
// 再接続ができなかった場合の処理
// 例:ユーザーへ通知する、NetworkRunnerを完全にシャットダウンする、など
}
}
private IEnumerator WaitForReconnection(NetworkRunner runner)
{
// 例:ゲームへの再接続をプレイヤーに通知
yield return new WaitUntil(() => runner.IsInSession);
Debug.Log("Reconnected to the Cloud!");
}
}
この例は、コールバックの登録方法・異なる結果への処理方法・再接続の成功を待機する方法を示しています。
Back to top