Space Turret: Defense Point - Часть 6. Локализация
Всем привет!
Когда мы только начинали проект, у меня уже тогда была хитрая идея для локализации.
Зачем нужны тонны текстов и подсказок, различных шрифтов, поддержка кириллицы, мучение с подборкой размера текстов... Это всё не нужно, если будут иконки! Вот он, секрет успешной локализации, - думал я! Человечество уже опубликовало тысячи мобильных игр, придумало всевозможные иконки под всё что угодно!
Воодушевившись этой идеей, мы начали работу над интерфейсом. Минималистичный дизайн, простые иконки и никакого текста!
Пример интерфейса
Но радость была недолгой. Как только мы дошли до дизайна окон, мы поняли, что немного текста добавить придется.
Интерфейс окна улучшений турели
Все только самое необходимое и нужное, минимум информации. :D
Тогда я задумался над системой локализации. Потому, что чем раньше ее сделать, тем меньше ошибок мы допустим при переводе на новые языки.
На тот момент у меня были общие знания по переводу, я где то видел использование файлов xml. Но идти по общему шаблону мне не хотелось. Я был уверен, что смогу придумать что то еще. Ведь у нас редактор Unity, наверняка в нем есть механизмы хранения данных... Например, ScriptableObject. В голове крутилась идея, что он может отлично подойти, главное - правильно организовать сами данные. Как обычно, я загрузил голову перед сном, а на утро уже родилась идея :)
Какие параметры нам могут пригодиться? Как минимум - шрифт, размер текста и набор уникальных идентификаторов. А также название языка и системный идентификатор языка, чтобы по нему потом выбрать локализацию в соотв. с настройками языка на телефоне.
Пример профиля локализации меню
Далее, чтобы программно определять, какой текст мы хотим считать, нам нужно создать свой тип перечислений (enum) и добавить функцию в наш профиль локализации ScriptableObject, которая бы по заданному типу возвращала нужную строчку.
Пример идентификаторов текста enum
Пример функции определения текста
После этого остается сделать простой менеджер локализаций, который будет хранить доступные профили, и скрипт, который мы добавим на все тексты. По заданному типу идентификатора скрипт будет считывать текст из текущего профиля локализации. Также, мы добавим в скрипт размер текста (Нормальный, Меньше, Мелкий), чтобы устанавливать необходимый размер шрифта. Готово!
Пример использования
Какие плюсы использования ScriptableObject?
Если бы мы делали локализацию на основе файлов XML, то нам пришлось бы их размещать в папке Resources, это может плохо сказаться на скорости загрузки приложения (при большом кол-ве файлов в Resources). Ограничение связано с тем, что работа с файлами доступна, только если сами файлы лежат в открытом источнике.
Наши же профили ScriptableObject мы можем размешать в любой части проекта и на скорость загрузки они будут влиять гораздо меньше.
В случае, если нам нужно добавить новую локализацию - нам будет визуально проще править все тексты и меньше шансов, что мы где то забудем перевести текст.
Помните, гораздо проще внедрить локализацию на ранних этапах разработки, когда Вы еще не забыли, на каких элементах есть тексты, в каких окнах и скрытых позициях. Также выработаете навык автоматического добавления нужных идентификаторов при появлении новых текстов :) Учтите, что новые идентификаторы текстов можно добавлять только в конец enum, иначе все текущие настройки текстов в сцене "сдвинутся".
На этом пока всё, о чем будет следующая статья - я еще не придумал, но обязательно что то придумаю :)
Спасибо, что дочитали!
Ниже я оставлю ссылки на примеры скриптов, может кому то понадобятся
Предыдущие статьи:
Часть 5. Игровой ИИ и с чего начать
Часть 4. Противники (продолжение)
Лига Разработчиков Видеоигр
6.8K постов22.2K подписчиков
Правила сообщества
ОБЩИЕ ПРАВИЛА:
- Уважайте чужой труд и используйте конструктивную критику
- Не занимайтесь саморекламой, пишите качественные и интересные посты
- Никакой политики
СТОИТ ПУБЛИКОВАТЬ:
- Посты о Вашей игре с историей её разработки и описанием полученного опыта
- Обучающие материалы, туториалы
- Интервью с опытными разработчиками
- Анонсы бесплатных мероприятий для разработчиков и истории их посещения;
- Ваши работы, если Вы художник/композитор и хотите поделиться ими на безвозмездной основе
НЕ СТОИТ ПУБЛИКОВАТЬ:
- Посты, содержащие только вопрос или просьбу помочь
- Посты, содержащие только идею игры
- Посты, единственная цель которых - набор команды для разработки игры
- Посты, не относящиеся к тематике сообщества
Подобные посты по решению администрации могут быть перемещены из сообщества в общую ленту.
ЗАПРЕЩЕНО:
- Публиковать бессодержательные посты с рекламой Вашего проекта (см. следующий пункт), а также все прочие посты, содержащие рекламу/рекламные интеграции
- Выдавать чужой труд за свой
Подобные посты будут перемещены из сообщества в общую ленту, а их авторы по решению администрации могут быть внесены в игнор-лист сообщества.
О РАЗМЕЩЕНИИ ССЫЛОК:
Ссылка на сторонний ресурс, связанный с игрой, допускается только при следующих условиях:
- Пост должен быть содержательным и интересным для пользователей, нести пользу для сообщества
- Ссылка должна размещаться непосредственно в начале или конце поста и только один раз
- Cсылка размещается в формате: "Страница игры в Steam: URL"