Игры и их разработка. Чем могу поделиться при разработке мультиязычности с Unity3D

Умение писать программы тренирует ваш разум и помогает мыслить лучше, создавая способ мышления, полезный, на мой взгляд, во всех областях.
Билл Гейтс, основатель Microsoft

Моя игра по ссылке в GooglePlay:


Лабиринт: Начало приключений


Буду благодарен оценкам и отзывам в самом Маркете, а также попробую ответить на все вопросы в комментариях под постом.


А теперь к самому интересному:


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

Игры и их разработка. Чем могу поделиться при разработке мультиязычности с Unity3D Длиннопост, Игры, Gamedev, Android, Unity3D, Текст, Карантин, Спасибо, Увлечение, Google Play

Я создал через обычный текстовый документ, сохранил и просто переименовал с формата .txt в формат .json

Игры и их разработка. Чем могу поделиться при разработке мультиязычности с Unity3D Длиннопост, Игры, Gamedev, Android, Unity3D, Текст, Карантин, Спасибо, Увлечение, Google Play

У кого нет полного расширения имени файла, тогда идём в «Вид», ставим галочку на «Расширения имён файлов».

Предупреждаю! Может возникнуть потом проблема с кодированием текста. Поэтому можно сразу скачать и воспользоваться программой Notepad++ и поставить правильную кодировку в UTF-8.

Игры и их разработка. Чем могу поделиться при разработке мультиязычности с Unity3D Длиннопост, Игры, Gamedev, Android, Unity3D, Текст, Карантин, Спасибо, Увлечение, Google Play

Сохраняем в проекте Unity3D таким образом:

Assets\StreamingAssets\Languages\

Подписываем так как вам угодно, так как загружать потом их вам, я решил так:

Игры и их разработка. Чем могу поделиться при разработке мультиязычности с Unity3D Длиннопост, Игры, Gamedev, Android, Unity3D, Текст, Карантин, Спасибо, Увлечение, Google Play

Как заполняется словарь:

Открываем фигурные скобки, так требуется для работы с .json

Потом задаём ключ, у меня это “mainmenu”, потом двоеточие и записываем значения.

Всё пишется в скобках и ставим запятую, после последнего значения запятая не ставиться!!!

Игры и их разработка. Чем могу поделиться при разработке мультиязычности с Unity3D Длиннопост, Игры, Gamedev, Android, Unity3D, Текст, Карантин, Спасибо, Увлечение, Google Play

Аналогично создаём русский словарь. Переводимые значения должны строго соблюдаться по порядку, что бы не было проблем с переводом, к примеру, где в EN текст стоит «No», в русском будет стоять «Старт».

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

Игры и их разработка. Чем могу поделиться при разработке мультиязычности с Unity3D Длиннопост, Игры, Gamedev, Android, Unity3D, Текст, Карантин, Спасибо, Увлечение, Google Play

Для начала создадим отдельный класс GlobalLang который будет считывать ключ и его значения.

Дальше объявим переменные и напишем метод LangLoad который и будет загружать сохранённый язык.

Для начала проверим андроид устройство или нет. Так как чтение файла на андроид девайсах отличается от обычной загрузки, это можно найти в оф документации Unity.

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

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

Я сделал окно с выбором языка, как только пользователь запускает первый раз игру, что бы потом можно было выгружать в “Language” название самого файла, выглядит это так:

Игры и их разработка. Чем могу поделиться при разработке мультиязычности с Unity3D Длиннопост, Игры, Gamedev, Android, Unity3D, Текст, Карантин, Спасибо, Увлечение, Google Play

Сам скрипт выглядит так:

Игры и их разработка. Чем могу поделиться при разработке мультиязычности с Unity3D Длиннопост, Игры, Gamedev, Android, Unity3D, Текст, Карантин, Спасибо, Увлечение, Google Play

В старте идёт проверка на показ выбора языка, дальше кнопки с выбором и сохранением языка для выгрузки текста из словарей.


Загрузка словаря по индексу выглядит так:

Игры и их разработка. Чем могу поделиться при разработке мультиязычности с Unity3D Длиннопост, Игры, Gamedev, Android, Unity3D, Текст, Карантин, Спасибо, Увлечение, Google Play

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

Тут присутствует переменная индекса значения из словаря.

Метод TextMenu который ищет значение в полученном тексте из файла, загружает и показывает его.


Ну и соответственно, что бы этот текст сразу был показан, пишу метод TextMenu в старте сцены.

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

Думаю как добавлять ивенты к кнопкам в Unity расписывать не стоит.


Что в итоге:


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

Всё просто и универсально!

Ваше мнение и может дополнительная информация по данной теме будет очень приветствоваться в комментариях.

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

ЗАПРЕЩЕНО:

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

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

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


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

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

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

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

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