Unity "Простая система перевода игры на другие языки"
Данная система подойдет для начинающих разработчиков или инди разработчиков. Данной решение не идеальное. Оно создавалось для простой hyper casual. Для визуальных новел или какой-нибудь RPG оно конечно же не подойдет.
Система рассчитана для работы в одной сцене. Для игр с несколькими сценами, данное решение может не работать. Тем не менее разобравшись в нем, его можно доработать под свои нужды.
Начнем со списка языков. Для удобства выбора языка в редакторе Unity я решил воспользоваться перечислением.
Следующий скрипт я наследовал от Scriptable Object. Сделано это для использования его в скриптах как объект, который хранит выбранный язык интерфейса.
Так же он содержит метод изменения выбранного языка на другой (ChangeLanguage).
Следующий скрипт. Скрипт предназначен для хранения строк на разных языках.
Последний скрипт, который понадобится, это скрипт изменения текста на интерфейсе.
Данный скрипт работает с только TextMeshPro. Если у вас в проекте обычный Text или какой-то еще. Тогда надо по подобию написать скрипт для вашего компонента интерфейса.
В этом скрипте используется событие onChangeLanguage, которое находится в статическом классе EventsManager. Вы можете добавить это событие туда, где будет удобно вам. Главное, чтобы к нему был общий доступ. Затем, вы можете вызывать его где угодно. Например при нажатии на кнопку сменить язык.
Попробуем использовать данную систему.
Создаем CurrentLanguage объект и выбираем язык, который будет установлен при старте игры.
Далее создаем несколько объектов TranslationString. Прописываем текст по соответствию языка.
Далее добавляем на объект, который содержит Text Mesh Pro — скрипт SetTextMeshProLanguage. И выбираем для него подходящий объект TranslationString.
На этом все. Далее можно, например, создать кнопку перевода на другой язык. Написать примерно вот такой скрипт. И язык будет меняться во всей игре.
Во время написания статьи, я понял, что Current Language нужно создать как-то по-другому. Например, статическим классом или синглтоном. Из-за того, что приходится каждый раз его выбирать в SetTextMeshProLanguage. Хотя он всегда будет в единственном экземпляре.
Что касается системы в целом. В дальнейшем, можно очень просто добавить еще один язык. И строки перевода. Если не устроит какая-то часть системы, то ее можно легко заменить (до того, как начали внедрять в свой проект).