Space Turret: Defense Point - Часть 6. Локализация

Всем привет!

Когда мы только начинали проект, у меня уже тогда была хитрая идея для локализации.

Space Turret: Defense Point - Часть 6. Локализация Мобильные игры, Gamedev, Игры на Android, Шутер, Онлайн-шутер, Unity, Длиннопост

Зачем нужны тонны текстов и подсказок, различных шрифтов, поддержка кириллицы, мучение с подборкой размера текстов... Это всё не нужно, если будут иконки! Вот он, секрет успешной локализации, - думал я! Человечество уже опубликовало тысячи мобильных игр, придумало всевозможные иконки под всё что угодно!

Воодушевившись этой идеей, мы начали работу над интерфейсом. Минималистичный дизайн, простые иконки и никакого текста!


Пример интерфейса

Space Turret: Defense Point - Часть 6. Локализация Мобильные игры, Gamedev, Игры на Android, Шутер, Онлайн-шутер, Unity, Длиннопост

Но радость была недолгой. Как только мы дошли до дизайна окон, мы поняли, что немного текста добавить придется.


Интерфейс окна улучшений турели

Space Turret: Defense Point - Часть 6. Локализация Мобильные игры, Gamedev, Игры на Android, Шутер, Онлайн-шутер, Unity, Длиннопост

Все только самое необходимое и нужное, минимум информации. :D

Тогда я задумался над системой локализации. Потому, что чем раньше ее сделать, тем меньше ошибок мы допустим при переводе на новые языки.

На тот момент у меня были общие знания по переводу, я где то видел использование файлов xml. Но идти по общему шаблону мне не хотелось. Я был уверен, что смогу придумать что то еще. Ведь у нас редактор Unity, наверняка в нем есть механизмы хранения данных... Например, ScriptableObject. В голове крутилась идея, что он может отлично подойти, главное - правильно организовать сами данные. Как обычно, я загрузил голову перед сном, а на утро уже родилась идея :)

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


Пример профиля локализации меню

Space Turret: Defense Point - Часть 6. Локализация Мобильные игры, Gamedev, Игры на Android, Шутер, Онлайн-шутер, Unity, Длиннопост

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


Пример идентификаторов текста enum

Space Turret: Defense Point - Часть 6. Локализация Мобильные игры, Gamedev, Игры на Android, Шутер, Онлайн-шутер, Unity, Длиннопост

Пример функции определения текста

Space Turret: Defense Point - Часть 6. Локализация Мобильные игры, Gamedev, Игры на Android, Шутер, Онлайн-шутер, Unity, Длиннопост

После этого остается сделать простой менеджер локализаций, который будет хранить доступные профили, и скрипт, который мы добавим на все тексты. По заданному типу идентификатора скрипт будет считывать текст из текущего профиля локализации. Также, мы добавим в скрипт размер текста (Нормальный, Меньше, Мелкий), чтобы устанавливать необходимый размер шрифта. Готово!


Пример использования

Space Turret: Defense Point - Часть 6. Локализация Мобильные игры, Gamedev, Игры на Android, Шутер, Онлайн-шутер, Unity, Длиннопост

Какие плюсы использования ScriptableObject?

Если бы мы делали локализацию на основе файлов XML, то нам пришлось бы их размещать в папке Resources, это может плохо сказаться на скорости загрузки приложения (при большом кол-ве файлов в Resources). Ограничение связано с тем, что работа с файлами доступна, только если сами файлы лежат в открытом источнике.

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

В случае, если нам нужно добавить новую локализацию - нам будет визуально проще править все тексты и меньше шансов, что мы где то забудем перевести текст.


Помните, гораздо проще внедрить локализацию на ранних этапах разработки, когда Вы еще не забыли, на каких элементах есть тексты, в каких окнах и скрытых позициях. Также выработаете навык автоматического добавления нужных идентификаторов при появлении новых текстов :) Учтите, что новые идентификаторы текстов можно добавлять только в конец enum, иначе все текущие настройки текстов в сцене "сдвинутся".


На этом пока всё, о чем будет следующая статья - я еще не придумал, но обязательно что то придумаю :)

Спасибо, что дочитали!


Ниже я оставлю ссылки на примеры скриптов, может кому то понадобятся

Профиль ScriptableObject

Менеджер локализаций

Скрипт для текстов


Предыдущие статьи:

Часть 5. Игровой ИИ и с чего начать

Часть 4. Противники (продолжение)

Часть 3. Противники

Часть 2. Генератор волн противников

Часть 1. История разработки

Лига Разработчиков Видеоигр

6.8K постов22.2K подписчиков

Добавить пост

Правила сообщества

ОБЩИЕ ПРАВИЛА:

- Уважайте чужой труд и используйте конструктивную критику

- Не занимайтесь саморекламой, пишите качественные и интересные посты

- Никакой политики


СТОИТ ПУБЛИКОВАТЬ:

- Посты о Вашей игре с историей её разработки и описанием полученного опыта

- Обучающие материалы, туториалы

- Интервью с опытными разработчиками

- Анонсы бесплатных мероприятий для разработчиков и истории их посещения;
- Ваши работы, если Вы художник/композитор и хотите поделиться ими на безвозмездной основе

НЕ СТОИТ ПУБЛИКОВАТЬ:

- Посты, содержащие только вопрос или просьбу помочь
- Посты, содержащие только идею игры

- Посты, единственная цель которых - набор команды для разработки игры

- Посты, не относящиеся к тематике сообщества

Подобные посты по решению администрации могут быть перемещены из сообщества в общую ленту.

ЗАПРЕЩЕНО:

- Публиковать бессодержательные посты с рекламой Вашего проекта (см. следующий пункт), а также все прочие посты, содержащие рекламу/рекламные интеграции

- Выдавать чужой труд за свой

Подобные посты будут перемещены из сообщества в общую ленту, а их авторы по решению администрации могут быть внесены в игнор-лист сообщества.


О РАЗМЕЩЕНИИ ССЫЛОК:

Ссылка на сторонний ресурс, связанный с игрой, допускается только при следующих условиях:

- Пост должен быть содержательным и интересным для пользователей, нести пользу для сообщества

- Ссылка должна размещаться непосредственно в начале или конце поста и только один раз

- Cсылка размещается в формате: "Страница игры в Steam: URL"