Перейти к основному содержимому

Автономный режим

«Автономно» в 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, так что вызывать его в автономной сессии безопасно и дёшево. Переподключение — обычный вызов подключения; предварительно ничего разбирать не нужно.

Чего эта страница не показывает​

Снимка сессии, играющей в автономном резерве, здесь ещё нет. Состояния, флаг и двенадцать сервисов прочитаны из кода и покрыты названным выше тестом; записанный прогон с намеренно остановленным сервером пока в ожидании.