Автономный режим
«Автономно» в 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: коду, который спрашивает «можно ли это
отправить?», в обоих случаях нужен один и тот же ответ.
Что продолжает работать
Любой сетевой сер вис можно построить вообще без менеджера. Это не побочный эффект, а контракт: сервисы создаются при запуске, когда ещё никто не знает, ответит ли сервер, и сервис, бросающий исключение в конструкторе, унёс бы игру с собой.
Поэтому WorldSyncService, BattleMatchmaker, SpectatorService, RaidBattleService, FriendService,
TradeService, GTLService, WalletService, ShopService, CloudSaveService, HousingService и
ChannelManager существуют и в автономной сессии. Чего они не делают — так это не общаются ни с чем: вызов,
которому нужен сервер, сообщает об ошибке, а не блокируется. CloudSaveService.HasCloudSave равно false, а
локальная система сохранений — та же, что в одиночной игре, — держит игру на ходу.
Эту границу удерживает тест в режиме редактора OnlineServices_HandleOfflineMode: он создаёт все двенадцать
сервисов с пустым менеджером и падает, если хоть один выбросит исключение.
Возврат в сеть
DisconnectAsync сразу возвращается, если состояние уже Disconnected или Offline, так что вызывать его в
автономной сессии безопасно и дёшево. Переподключение — обычный вызов подключения; предварительно ничего
разбирать не нужно.
Чего эта страница не показывает
Снимка сессии, играющей в автономном резерве, здесь ещё нет. Состояния, флаг и двенадцать сервисов прочитаны из кода и покрыты названным выше тестом; записанный прогон с намеренно остановленным сервером пока в ожидании.