- PVSM.RU - https://www.pvsm.ru -
Привет! Совсем недавно я начал рассказывать о том, как мы работаем над Stormfall: Rise of Balur и пишем клиентскую часть проекта на Unity. Сегодня мы поговорим о подходе к скинованию, многопоточности, работе с сетью при плохом соединении и кэшировании запросов.
Жанр RTS хорошо адаптируется под разные сеттинги на базе одного движка. У нас есть несколько таких игр. При написании проекта меняется многое: UI, UX, логика геймплея. Иногда могут появляться специфические требования к интеграции библиотек и социальных сервисов. При проектировании игры мы должны были заложить требования в архитектуру, сохранив максимально возможный шаринг кода.
Чтобы кастомизировать поведение UI, мы решили сделать так, чтобы работа UI-объектов начиналась с динамической загрузки префабов из ресурсов. После этого выполняется специфический View-скрипт, который завязан на особые классы из ViewModel. Сама Модель написана так, чтобы поддерживать все фичи, потому что является отражением сервера и конфигурируется при логине с сервера.
В Unity отсутствует файл с описанием проекта: весь код, который находится в папке Assets, попадает в билд. При таких условиях создавать несколько проектов с общей код-базой сложно. Мы решили, что будем использовать общий репозиторий, в котором проект лежит не в виде Unity-проекта, а в том виде, который нам нужен.
С помощью скрипта, который создает симлинки на папку с кодом, мы разворачиваем Unity-проект. Если нужно, разворачиваем Dev-билд. В нем есть весь код, в том числе и из других проектов. Это нужно, например, для рефакторинга, а на геймплей никак не повлияет.
Когда мобильный рынок только набирал обороты, разработчики обсуждали, нужна ли многопоточность для их приложений. Сейчас это уже не вопрос для обсуждения. Многопоточностью мы решаем несколько задач:
Механизм доступа к данным модели работает через монитор и поддерживает различные политики блокирования данных. Он дает доступ на чтение множеству объектов одновременно, но не допускает возможность скомбинировать это с записью данных в Модель.
Unity не позволяет работать с движком из неосновного потока. Помните об этом при проектировании приложения и старайтесь разгрузить основной поток, вынося обработку не UI-данных в другие потоки.
В Stormfall: Rise of Balur взаимодействие с сервером происходит через HTTP-запросы. В случае ошибки запроса мы не всегда можем определить, на каком этапе произошла ошибка и был ли выполнен запрос на сервере. Нужно помнить, что мобильные игры работают через мобильный интернет, который не всегда стабилен. Чтобы обеспечить пользователям комфортный игровой процесс, мы реализовали несколько подходов:
Теперь более детально о каждом подходе.
Мы реализовали механизм в командах-запросах, который позволяет избежать блокировок UI при их выполнении. После того, как запрос начинает выполнятся, мы изменяем модель так, чтобы сервер как бы вернул успешный ответ. Если ответ был действительно успешным, мы ничего не меняем или дополняем модель ответом от сервера. Если сервер возвращает ошибку, вызываем метод отката изменений, которые выполнились на начальном этапе, и уведомляем об ошибке пользователя.
Что конкретно мы для этого сделали:
Перейдем к реализации второго подхода:
По статистике 0.76 % процентов запросов забираются из кэша, а это каждый 130-й запрос пользователя.
До встречи в третьей части! Если вы пропустили начало цикла о создании MMO RTS на Unity, ищите его здесь [1].
Автор: Plarium
Источник [2]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/ui/229615
Ссылки в тексте:
[1] здесь: https://habrahabr.ru/company/plarium/blog/317976/
[2] Источник: https://habrahabr.ru/post/318966/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best
Нажмите здесь для печати.