Как реализовать казуальную игру с социальными механиками, поддерживающую офлайн и онлайн режимы
Что проверяют
Умеете ли вы спроектировать игру, где офлайн это нормальный режим, а не ошибка, и где сервер при этом не доверяет клиенту. Следом спрашивают про синхронизацию прогресса после долгого офлайна и защиту таблицы лидеров.
Как отвечать
Раз стек C#, клиент почти наверняка на Unity, а сервер на ASP.NET Core. Каркас:
- локальный прогресс как основа: состояние сохраняется на устройстве, в
Application.persistentDataPathв JSON или SQLite.PlayerPrefsоставляют для настроек. Игра запускается и без сети; - очередь операций: действия, влияющие на прогресс, пишутся командами с уникальным идентификатором и уходят пачкой, когда появилась сеть. Сервер обрабатывает их идемпотентно, повтор после обрыва не начислит награду дважды;
- разделение авторитета: пройденные уровни и косметику можно доверить клиенту, а валюту, покупки и очки для рейтинга проверяет сервер. Конфликты решаются правилом на поле: максимум для прогресса, серверное значение для валюты, последняя запись для настроек;
- асинхронные социальные механики: рейтинг среди друзей, подарок жизни, просьба о помощи. Им не нужен живой онлайн: офлайн показываются кэшированные данные, действия встают в очередь. Рейтинги удобно держать в sorted set Redis, уведомлять пушами или через SignalR, пока игрок в игре;
- аккаунт: гостевой создаётся сразу, позже привязывается к аккаунту платформы. При входе с другого устройства нужен понятный выбор, какой прогресс оставить;
- абстракции:
IProgressStoreиISocialServiceс локальной и сетевой реализацией, чтобы геймплей не знал, есть ли сеть.
Где спотыкаются
Проверяют сеть через Application.internetReachability. Свойство говорит лишь о типе доступной сети, а не о том, что сервер отвечает. Реальную связь показывает только успешный запрос.
Считают таймеры по DateTime.Now на устройстве. Игрок переводит часы и получает жизни и награды, поэтому время для таких механик сверяют с сервером.
Отправляют очки в рейтинг просто числом с клиента. Без серверной проверки, хотя бы на правдоподобие результата, таблица лидеров быстро заполняется подделками.