Нужен ассет, который будет хранить данные в XML. Желательно с удобным GUI в юньке.
Принципиально важное требование - я должен иметь возможность управлять жизненным циклом этого ассета (иметь возможность инициализировать его не раньше определенной сцены как минимум).
Суть в том, что я хочу подгружать более свежие XML через бандлы, а менеджер должен их съедать, парсить и т.д.
Пока что лучший вариант который я видел - SmartLocalization. Но он запускается со стартом проекта, поэтому не успеваю скормить ему новую XML.
Unity и локализация - советую I2 Localization плагин. стоит каждой копейки.
ОЧЕНЬ удобно хранить все в гугл доке. (особенно если надо отдавать на перевод кому-нибудь стороннему)
а возможность обновлять из гугл таблицы в уже зарелиженном приложении - просто каиф.
ну и просто автор не запускает проект. отвечает. дорабатывает.
куча наворотов в виде поддержки языков "справа на лево" и готовых "обвесов".
как уже сказал стоит каждого цента и экономит КУЧУ времени.
я конечно понимаю, что тут выпадает ваш пункт с "хочу свою xml подгружать" . но все же если нужна готовая и рабочая и удобная система локализации. может вполне сгодится.
а возможность обновлять из гугл таблицы в уже зарелиженном приложении - просто каиф.
т.е. если я выпущу игру в гп и в какой-то момент захочу добавить в нее новых текстов - мне не придется выкладывать новую версию апк в гугл? Локализация сама подтянет обновления из гугл доки?
у нас были две самописные. одна сторонняя. в итоге остановились на этой. если требуется локализация в Юнити проекте . особенно если там что-то сложнее чем названия пары кнопок перевести.
и работает над проектом не один человек. и локализуют частично сторонние переводчики.
ну а вообще если вы пользовались приложениями на андроиде и обновляли их. то обновить приложуху - ради фиксов в локализации - нормальное дело.
не понимаю зачем вам нужно подтягивание. встроили. проверили. собрали. и забыли про переводы.
Denis Gaydak, игра которую я делаю состоит на 50% из текста.Остальные 50 % это аудио файлы картинки и ScriptabloObjects (соотношения взято исходя из геймплея, а не размера файлов).
По моей задумке, я хочу избавить пользователя от необходимости заходить на гп за обновлением. Обновления будут доставляться пользователю моментально и без посредника в виде любого стора. Это гарантирует наличие последней версии игры у каждого пользователя.
вы же понимаете что доставлять со своего сервера..чревато) наличием сервера и огромным трафиком.
вот станет у вас 10 000 пользователей. каждый выкачет бандлик на 1мегабаит. один раз.
а еще как вы будете гарантировать что пользователю надо или нет качать? свой сервер? свои локализации?
все равно грузить из гугл плея. у многих стоит автообновление.
китайские сторы разве что. но там вам отдельные сервера вкитае иметь почти наверняка придется. или прокси.
в общем смотрите на плюсы и минусы) сложить кучу забот по доставке контента на гугл меркет - обычно удобнее. чем многие и пользуются.
Такой вопрос: как мне оповестить пользователя о доступности новой версии приложения в случае если он играет со старой?
Лучшее что пока что придумал - при наличии интернета загружать бандл с хешем последнего обновления. Если он совпадает с сохраненным на устройстве - ничего не выводить. Иначе вывести мол "скачай новую версию"
тут уже кто на что горазд. с принудительным апдеитом.
вообще если у вас где то будет свой сервер. ... то обычно делают простеиший малюсенький запросик. который возвращает с сервера "номер доступной версии". и в клиенте вшит номер. сравнили. надо обновлять - говорим что сорян. без обновы не играем иди качай.
бывает еще передают кроме последней версии в сторе - совместимую версию) тоесть клиент версии 5, в маркете есть версия - 7. а минимально совместимая 6.
но как уже сказал кто что придумает. не у всех там одинаково и универсально.
Павел, вы хотите вместоtext = "Hi, world" вызывать text = "Hellow, world". Значит вам надо заменить кусок сборки, содержащий этот текст. Этим как раз и занимаются патчи. По сути, они обновляют приложение. Вы же не собираетесь динамически делать откаты к старым версиям локализации))
Griboks, я собирался загружать бандлы в которых лежат несколько XML для разных языков. Скачав - я бы скармливал их сущности, которая умеет эти XML парсить в словари. Таким образом у меня всегда были бы актуальные словари без необходимости заставлять юзера качать обновление на ГП.
Чем патч отличается от загрузки бандла? Пока что это для меня одно и тоже.
Ну и если у Вас на примете есть обучающие материалы или готовые решения - посоветуйте, пожалуйста.
Павел, смысл бандлов в динамической загрузке во время выполнения + интеграция в юнити. Если загружать обычный файл, то придётся его парсить и обрабатывать, а бандлы уже подсовывают готовые к работе данные.
Даниил Басманов, но ведь они загружаются. Значит, что-то записывается в оперативную память. Выключили программу - память стёрлась. При следующем запуске придётся снова загружать.
Даниил Басманов, эта штука не имеет никакого отношения к теме. Речь о том, что бандлы требуют загрузки в оперативную память при каждом запуске, а патчи - только один раз во время установки. Патчи - это маленькие обновления, которые затрагивают только проблемные места.
Griboks, Чем загрузка файла из бандла с диска отличается от загрузки из ресурсов? Ничем. Более того, бандл после скачивания можно распаковать и сохранить на диск ту же самую xml-ку, если хочется сэкономить время на распаковке. Совершенно нормальная практика которая работает везде, а бинарники патчить далеко не на всех платформах можно.
бинарники патчить далеко не на всех платформах можно
Опа. Наконец-то вы что-то осмысленное написали. Про платформу ничего не уточнялось, так что способ подходящий на некоторых платформах.
p.s. Кажется вы не поняли про патчи. Эта штука вообще не загружается, а один раз ставится и всё. Больше её не существует, в отличии от бандлов или ресурсов.
Griboks, Что значит не загружается? Запуск сцены, загрузка из ресурсов и загрузка файла с диска это тождественные операции, их суть одинаковая. Единственное отличие патчей только в том, что они делают это снаружи приложения, а не изнутри.
Даниил Басманов, нет, патчи изменяют бинарники таким образом, как если бы скомпилировать новую версию и установить её вместо текущей. Таким образом, никаких дополнительных загрузок, проверок и прочего не происходит во время работы приложения.
ребят) я не то чтоб хочу продолжать спор.
но вот применимо к Юнити. есть какой то удобный и вменяемый вариант делать патчи?
Пк? Андроид?
просто если есть пояснения - поглядел бы)
а про бандлы - есть же Lz4 сжатие для них.
в этом формате из бандла в оперативку попадает ТОЛЬКО выбранный ресурс.(так же как и в несжатых бандлах, но они огромны по размеру)
нужна текстура - достал из бандла только текстуру) никакого оверхеда в оперативке)
Denis Gaydak, тем не менее, вам нужно в коде где-то подгрузить какой-то ресурс, причём делать каждый раз при запуске. Патч же применяется всего один раз.
Каких-то конкретных пояснений у меня нет. Зато можно поискать в интернете, например: 1, 2, 3.
один раз применился. и точно так же каждый раз загружается.
поменял патчем текст "ппппп" на "аааааа" и что он по вашему не грузится из бинарника приложухи теперь?
как грузился набором ноликов и единиц. так и грузится. точно так же из папки в системе. всегда и на старте.
а про патчей систему. а про что то готовое и автоматическое. мол вот была одна сборка. зафиксировал.
комитил /менял/делал. и вуаля. вместо новой апкашки - юнити собирает небольшой патч. который можно в гугл плей тот же подгрузить. и будет не вся игра качаться заново. и не obb фаил здоровенный. а маленький патч.
но что то именно на такой вариант, доступный как я понимаю при нативной разработке в андроид студио, не встречал
Denis Gaydak, я под андроид не люблю что-то писать. Вот какой-нибудь windows - да хоть на коленке автопатчинг напишу.
поменял патчем текст "ппппп" на "аааааа" и что он по вашему не грузится из бинарника приложухи теперь?
Тут есть большое отличие от бандлов.
Через бандлы код выглядит как LoadBundle();MainMenu.Items[0]=GetLocal("play"); , а использование патчей намного упрощает этот процесс: MainMenu.Items[0]=GetLocal("play");. Иными словами, вы можете просто выкинуть из головы половину работы - её сделает патч, причём за одну итерацию, а не при каждом запуске вашего приложения.
p.s. А LoadBundle() ещё много чего инкапсулирует. Например, функций 10. Если каждый день запускать программу, а патчить каждую неделю, то вы экономите аж 70 строчек кода. Этакая антииндусская математика)