Главная » Статьи » Программирование » Unity |
Каждый разработчик игры в процессе разработки или в ее начале приходит к тому, что в его возникает мысль о том, чтобы в его игре было несколько языков. Скажу сразу сделать это не сложно и есть много способов для этого. Я поделюсь тем способом, который использую чаще всего. Весь процесс доступа к текстам на разных языках в играх у меня состоит из нескольких частей. Первое это файл с данными для того или иного языка. Обычно все языки я кладу в один файл потому, что не вижу смысла делить на несколько файлов. Смысл в нескольких файлах возможно будет в играх где очень много диалогов и много текста, разделение на несколько файлов в этом случае будет разумным решением потому, что это ускорит получение текста для этого или иного объекта. Я обычно храню все в xml файлах потому, что мне удобнее всего именно в них размещать информацию. Обычно мой файл выглядит следующим образом:
В моих играх обычно не используется более двух языков. Обычно русский и английский, если вы хотите 10 и более, то лучше придумайте как сопоставить значения переменной «SystemLanguage» с данными в вашем файле. Если в игре не слишком больше количество фраз, я обычно выгружаю большую часть и храню ее в коллекции для ускорения доступа за исключением длинных фраз, состоящих из двух и более предложений их я подгружаю из файла, если они где-то требуются. За загрузку и доступ к данным из файла у меня обычно отвечает класс, прикреплённый к неуничтожаемому объекту, методы класса, за исключением «void Start()», статические. Далее идет пример класса отвечающего за загрузку языка. Я не стал делать объект класса неуничтожаемым или статическим, это дело уже за вами какой способ вам больше нравится. Я бы остановился на первом так как в случае чего объект и класс можно будет убрать из памяти, а если статический сами понимаете от загрузки до окончания работы вашей игры класс и данные, который он в себе содержит будут висеть в памяти. На самом деле процесс загрузки данный из файла занимает не так много времени, поэтому вы можете создать для каждой из сцен свой собственный языковой файл и загружать допустим по названию сцены или ..... В общем решите эту задачу самостоятельно, она не сложная.
Я в своем примере я храню значения фраз игры вот в таких классах, это удобнее чем хранить в двух массивах (ключи, фразы) потому, что могут возникать сложности в синхронизации и удалении, поэтому, чтобы это избежать я объединяю связанные между собой коллекции в одну, поместив связанные элементы в класс.
Вот так собственно будет выглядеть сам класс. Тут есть функции для загрузки данных из файла, а так же функции поиска для получения слова по ключу. Как вы видите в качестве ключа для использовал строковые значения для удобства, но вам я рекомендую использовать числовые, чтобы поиск по ключу происходил быстрее. Разбор данных из файла здесь я убрал в отдельный поток, чтобы если файл был большим не было дополнительных фризов в игре, можно конечно использовать "Coroutine", но они мне не нравятся так, как не смотря на асинхронность они работают в основном потоке. Если в "Coroutine" будет какой-то сложный алгоритм требующий мощностей для вычислений, то будет фриз в игре. В своих играх я использую реактивные расширения (UniRx), они упрощают многие задачи, и упрощают процесс локализации, но с учетом того, что не каждый их использует я буду покажу классический вариант скрипта, который прикрепляется к текстовому полю.
Это классический вариант без дополнительных потоков. Однако стоит заметить, если у нас ключ будет изменяться, то это будет тормозить основной поток игры, а он занимается графикой, следовательно, частые запросы фраз может затормозить игровой процесс, что будет очень неприятно для любого игрока. Поэтому стоит усложнить наш скрипт добавив в него поток.
Такой способ даст возможность снять нагрузки с основного процесса. Однако, обратите внимание, что в этом фрагменте будет использоваться случайно выделенный поток, поэтому рекомендую выделить для локализации один отдельный поток, чтобы не размножать из, все-таки количество ядер у нас выше потолка не поднимется, а, следовательно, от большого числа потоков смысла не будет, к тому же язык переключают не так часто, что можно обойтись и одним потоком. Под конец хочу добавить несколько слов. В своем примере по отображению надписей я не упомянул о том, что необходимо добавить еще механизм перезагрузки текстов во всех надписях. Это сделать очень легко просто в функцию смены языка добавить поиск всех объектов содержащих класс, отвечающий за запрос фразы и отображение ее на сцене, в моем случае вызвать функцию старт "Start", которая заново запросит фразу по ключу. Кроме того, в своих примерах я использовал числа для работы с коллекцией SystemLanguage, но можно пойти и другим путем - приравнивать переменные такого типа к типу int или к строке. Надеюсь данная статья поможет начинающим разработчикам игр.
| |
Просмотров: 1802 | |
Всего комментариев: 0 | |