Comments 15

Спасибо. Познавательно.
Возможно Вы еще подскажете решения по обновлению версий приложений без апдейтов в сторы?

Благодарю за отзыв!

К сожалению, на вскидку ничего не приходит в голову, так как не возникало такой нужды. Но если будет что-нибудь интересное, то напишу.

Далее речь про андроид:
Если речь про обновление каких-либо платформенных штук (типо названия приложения, версии в системе), то никак. Проблема тут в том, что все эти сведения содержатся в apk, который изменить без установки поверх нового apk с изменениями не получится чисто из-за устройства ОС.
Если речь об обновлении кода, то можно, если использовать mono в качестве бэкенда. С сервера скачивать новые dll, затем подгружать их через Assembly.Load. Таким макаром можно обновлять логику (конечно, нужно проделать доп. манипуляции по выносу загружаемого кода в отдельную библиотеку). Но тут нюанс в том, что таким образом можно в теории загрузить вообще любой код, что по правилам Google Play в относительно серой зоне по дозволенности (можно загружать код, если он в виртуалке и имеет ограниченный доступ к системе).
Но, зная реалии и то, что сейчас в моде il2cpp, всё усложняется. В данном случае нужно уже встраивать какой-нибудь интерпретатор, тот же интерпретатор javascript, а потом с сервера скачивать и выполнять уже js.
TLDR:
Изменять код с mono backend: загрузка с сервера dll + Assembly.Load.
Изменять код с il2cpp backend: загрузка с сервера скриптов + использование интерпретатора

Спасибо за ответ. вопрос больше про яблоко с их неадекватным подходом с апрувом версий. Смотрим на топовых издателей и видим как у них после установки игры идет еще загрузка с их серваков и обновления тоже. Поэтому и есть желание делать лоадер, апрувить в стор и уже потом через него грузить основной модуль.

Если вы имеете в виду обновление именно контента, то можно банальными ассет бандлами обойтись (на любой платформе). Но мне изначально показалось, что вы спрашиваете о полностью автономных обновлениях (контент, логика, библиотеки и пр.). В таком случае, как уже говорил, ничего относительно простого и прозрачного не припоминается.

And42, дельный совет, спасибо за комментарий!

Для начала рассматривается внедрение новых уровней в игре. Я понимаю., что пейменты и тд. это уже на грани бана, но простое обновление версии с новыми уровнями и багофиксом более 2 недель — это жесть.

Если говорить за мобайл, то нельзя загружать новый исполняемый код без обновления приложения в сторе, выход один, разбить свою игру на логические блоки и с помощью плэймэйкера/болт, грузить через ассет бандлы новый контент.

Для этой задачи лучше подойдёт Zenject. Там тоже нужно кидать специальный класс в сцены, но не нужно создавать классы для каждой сцены, а только для тех, где нужно отлавливать параметры.
В любом случае рекомендую пользоваться этой библиотекой(и для других целей), жизнь станет проще когда привыкните.
А ещё ожидал увидеть как вы делаете переходы с анимациями(пока анимация проигрывается можно загрузить другую сцену и поломать всё), и загрузку по порядку. К слову там бывает проблема, когда загружаешь 2 сцены подряд аддитивом, но первая загруженная сцена решает тоже загрузить или выгрузить другую сцену и порядок ломается.

Zenject это вообще великолепная вещь. Как говорится, знаем, практикуем. Кажется, любой, единожды оценивший все прелести DI, уже не захочет без него работать. Специально его не упоминал, так как был уверен, что кто-нибудь дополнит в комментариях. :)
А как Zenject сочетается со скриптами темы? Как? Или почему тут решили что-то своё использовать? Соглашусь, что инструмент удобный, в т.ч. позволяет удобно контролировать память, но слишком уж много сложностей и неопределённости без достаточной документации, и так же, как оказалось, не мало способов сделать всё ещё хуже в плане архитектуры. После некоторого опыта решил, что оно того не стоит, если хотя бы какую-то часть проекта отправить в «свободное плавание» со средним разработчиком.

Мы в другом проекте используем менеджер для загрузки/выгрузки сцен с контролем по имени сцены и соот. enum, грузится всё через async Task функцию, где возвращается объект со сцены IScreen по срабатыванию OnSceneLoaded(после Awake, OnEnable, но до Start), что позволяет проводить функции загрузки всё так же в Start, а ссылки назначать до того. Проблему пока вижу только в том, что будут ошибки при загрузке 1 сцены с 2 мест одновременно, но для нас это не критично. Очень уж убог функционал по загрузке сцен в самой Unity, а то можно было бы сделать и лучше.

Благодарю за решение. То же возникала подобная проблема, решение из этой статьи думаю мне подойдёт. Жду следующих полезных статей)

Интересное решение, наткнулся на него около месяца назад. Респект автору, но мне показалось, что, как для такой не очень сложной задачи, это немного оверинжениринг. ИМХО, конечно.
Only those users with full accounts are able to leave comments. Log in, please.