Здравствуй, игродел!
В этой статье ты узнаешь как сделать удобную локализацию в своей игре.
Проблема:
Язык - пожалуй, один из главных порогов для игроков, если ваша игра поддерживает английский, многие смогут понимать, что в ней происходит, но как быть с аудиторией, не владеющей этим языком? Да и играть в игру с поддержкой родного языка всегда приятнее.
Для малоопытного разработчика может быть весьма неочевидно, как реализовать многоязычность своей игры, порой этот вопрос возникает, когда часть игры уже закончена, в таком случаи система локализации должна быть "надстройкой" к уже существующей базе кода, а не перестраивать её в связи с новой задачей.
Пути решения:
Как и с любой задачей в программировании игры, мы можем найти массу путей решения, так и здесь.
1) Assets, мощный инструмент Unity, позволяющий использовать реализованный кем-то функционал в своём проекте, локализация - не исключение, например simple localization, однако использование такого решения может быть сложным, если проект небольшой и займет больше времени чем собственная реализация, к тому же оно не дает понимания того, как работает локализация в играх.
2) Разные версии игры на разных языках. Сомнительный метод, однако раньше его часто использовали для экономии памяти и упрощения самой игры, однако то время прошло и сейчас дополнительный скрипт и файл в ресурсах игры - мелочь, способная сэкономить массу времени на поиске в коде текста подлежащего переводы.
3) Перевод по файлу, на мой взгляд лучший способ, который мы и реализуем ниже своими руками. Переводчику будет просто работать с одним текстовым файлом.
Решение:
Для начала нам нужно создать csv файл, в котором будем хранить перевод всех текстовых надписей в игре. Сделать это можно в Exсel или просто в блокноте (ведь csv - текстовый файл):
Структура файла такова: первая строка - наименования столбцов, " ; " - разделитель элементов разных столбцов, находящихся на одной строке. id - уникальный индикатор текста, переводы которого хранятся в соответствующих столбцах той же строки.
Когда вы разместите Localization.csv в Resources (там я создал папку "Localization" и уже в неё поместил сsv) своей игры вы увидите, что Unity воспринимает ваш файл как Text Asset, так и должно быть, для него в Unity есть свои методы загрузки, потому нам не придётся заниматься парсингом.
Итак, перед непосредственной локализацией текста нам нужно реализовать выбор языка:
// Language_changer.cs
using UnityEngine;
public class Language_changer : MonoBehaviour
{
public void Set_RU()
{
// сохраняем пару ключ-значение
PlayerPrefs.SetString("GameLanguage", "RU");
// выведем сведетельство того, что игра увидела смену языка
Debug.Log("Language changed to RUSSIAN");
}
public void Set_EN()
{
PlayerPrefs.SetString("GameLanguage", "EN");
Debug.Log("Language changed to ENGLISH");
}
}
Этот скрипт надо прикрепить к префабу, а его повесить на кнопки, отвечающие за выбор языка:
Наконец можно писать сам скрипт-локализатор, который в последствии мы будем вешать на всё, что имеет поле Text...
// Localizator.cs
using UnityEngine;
using UnityEngine.UI;
using System.Text.RegularExpressions;
public class Localizator : MonoBehaviour{
public string id;
void Awake(){ // если язык выбран...
if (PlayerPrefs.HasKey("GameLanguage")){
string GameLanguage = PlayerPrefs.GetString("GameLanguage"); // RU/EN
change_text(localized_text(id, GameLanguage));
}else{ // если язык не выбран то английский по умолчанию
change_text(localized_text(id, "EN"));
}
}
private void change_text(string new_text){
// вставляем текст в текстовое поле объекта на котором висит скрипт
GetComponent<Text>().text = new_text;
}
private string localized_text(string id, string lang){ // вытаскиваем из таблицы значение
// читаем из Resources/Localization/Localization.csv
TextAsset mytxtData=(TextAsset)Resources.Load("localization/localization");
string loc_txt=mytxtData.text;
string[] rows = loc_txt.Split('\n');
for (int i = 1; i < rows.Length; i++);
string[] cuted_row = Regex.Split(rows[i], ";");
if(id == cuted_row[0]){
if(lang == "EN"){
return cuted_row[1];
}else if(lang == "RU"){
return cuted_row[2];
}
break;
}
}
return "translation not found"; // если перевод не найден в таблице
}
}
Готово! Все что нужно для локализации - просто прикрепить скрипт к объекту (имеющему поле Text), указывать id (публичную переменную скрипта) и внести id с соответствующими переводами в файл локализации.