メインコンテンツまでスキップ

オフラインモード

MCE における「オフライン」には二つの意味があり、これを混同すると、最初から存在しないはずの接続のデバッグに一日を費やすことになります。

何であるか誰のためか
オンライン層なしMCE_ONLINE スクリプティング定義なしでビルドされたエンジン。Nakama 層はそもそもコンパイルされません。すべてのシングルプレイヤー作品。これが既定です。
オフラインへの退避オンライン層はコンパイルされているが、応答するサーバーが今は存在しない状態。サーバーが停止したオンライン作品、あるいは接続のないプレイヤー。

シングルプレイヤー作品にこのページは不要です。MCE_ONLINE がなければ失う接続もありません。以下は二列目の話です。

セッションがオフラインになる条件​

NakamaManager の状態機械は一つで、四つの状況が Offline を引き起こします。

状況起きること
OnlineConfig アセットが見つからないOffline になり、ログに No OnlineConfig found. Online features disabled.
設定で EnableOnline が無効Offline になり、接続呼び出しは例外ではなく false を返す
接続に失敗し、AllowOfflineFallback が有効(既定)Offline になり、ログに Falling back to offline mode.
接続に失敗し、AllowOfflineFallback が無効Failed — 半分だけオンラインで動くより停止を選ぶ作品のための、別の状態

最後の行こそがこのフラグの存在理由です。進行が権威的でなければならない作品——競技ラダー、共有経済——は、サーバーが決して受け取らないセッションをプレイさせるより、起動を拒むほうが健全です。オンラインが付加価値である作品はその逆を望みます。フラグは OnlineConfig アセット内、EnableOnline の隣にあります。

IsOffline は Offline と Disconnected の両方で真になります。「これを送れるか?」と問うコードは、どちらの場合も同じ答えを求めているからです。

動き続けるもの​

すべてのオンラインサービスは manager なしで構築できます。これは副作用ではなく契約です。サービスは起動時、サーバーが応答するか誰も知らない時点で構築されるため、コンストラクタで例外を投げるサービスはゲームごと落としてしまいます。

したがって WorldSyncService、BattleMatchmaker、SpectatorService、RaidBattleService、FriendService、TradeService、GTLService、WalletService、ShopService、CloudSaveService、HousingService、ChannelManager はオフラインセッションでも存在します。行わないのは通信だけで、サーバーを必要とする呼び出しはブロックせず失敗を報告します。CloudSaveService.HasCloudSave は false で、ローカルのセーブ系——シングルプレイヤー作品と同じもの——がゲームを支えます。

この線を守っているのはエディットモードのテスト OnlineServices_HandleOfflineMode です。十二個すべてを null の manager で構築し、いずれかが例外を投げたら失敗します。

オンラインに戻る​

DisconnectAsync は状態がすでに Disconnected か Offline のときは即座に戻るため、オフラインセッションで呼んでも安全かつ安価です。再接続は通常の接続呼び出しで、事前に何も解体する必要はありません。

このページが示していないこと​

オフライン退避でプレイしているセッションのスクリーンショットはまだありません。状態、フラグ、十二のサービスはコードから読み取り、上記のテストで覆われています。サーバーを意図的に止めた実走の記録は保留中です。