Найти в Дзене
Евгений Камалов

Как без плагина PluginYG на Unity для Яндекс игр сделать метод автоматического определения языка с помощью i18.lang.

Требования к игре на платформе Яндекс игры, постоянно меняются. Теперь им нужен еще один метод, ysdk.environment.i18n.lang. Его нужно вызывать, когда игра загрузила все ресурсы и готова к взаимодействию с пользователем. Для начала у вас должно быть готово в игре хотя бы главное меню, если конечно по задумке игры оно вообще должно быть. У меня просто в игре "Битва машин в пустоши" есть главное меню, поэтому метод автоматического определения языка, я сделал на этой сцене. Сначала надо создать статический скрипт с именем Global. Этот скрипт кидать никуда не нужно, он просто в папке лежит (в какую захотите, имя папки роли не играет). using System.Collections; using System.Collections.Generic; using UnityEngine; public class Global {
public static string language; // Какой язык в игре
public static string contDevice; // На Какой платформе запущена игра (ПК или мобила) } Помимо определения языка в этом скрипте еще есть определения на какой платформе запущена игра (ПК или телефон). Также мо

Требования к игре на платформе Яндекс игры, постоянно меняются. Теперь им нужен еще один метод, ysdk.environment.i18n.lang. Его нужно вызывать, когда игра загрузила все ресурсы и готова к взаимодействию с пользователем.

Для начала у вас должно быть готово в игре хотя бы главное меню, если конечно по задумке игры оно вообще должно быть. У меня просто в игре "Битва машин в пустоши" есть главное меню, поэтому метод автоматического определения языка, я сделал на этой сцене.

Сначала надо создать статический скрипт с именем Global. Этот скрипт кидать никуда не нужно, он просто в папке лежит (в какую захотите, имя папки роли не играет).

Создайте статический скрипт с именем Global
Создайте статический скрипт с именем Global
-2
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Global
{
public static string language; // Какой язык в игре
public static string contDevice; // На Какой платформе запущена игра (ПК или мобила)
}

Помимо определения языка в этом скрипте еще есть определения на какой платформе запущена игра (ПК или телефон). Также можно в этом скрипте хранить числовые значения (float, int). Уровень громкости звуков, номер уровня и тд. Но мы отвлеклись от темы статьи.

Сам перевод текста с русского на английский, у меня в игре только эти языки используются, я сделал с помощью простого скрипта TextLanguage.cs. Этот скрипт подходит для простых игр, где нет больших диалогов. Если в вашей игре реализовано по-другому перевод текста, используете его. Я вам просто показываю подход, как определять язык игры при загрузке.

На текст, который нужно перевести кидаем скрипт TextLanguage.cs.

На текст, который нужно перевести кидаем скрипт TextLanguage.cs.
На текст, который нужно перевести кидаем скрипт TextLanguage.cs.
-4
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class TextLanguage : MonoBehaviour // Этот скрипт вешать на текст который нужно перевести
{
public string language;
private Text text;
[TextArea(5, 10)] public string textRu;
[TextArea(5, 10)] public string textEng;
private void Start()
{
text = GetComponent<Text>();
}
private void Update()
{
language = Global.language;
if (language == "" || language == "ru")
{
text.text = textRu;
}
else if (language == "en")
{
text.text = textEng;
}
}
}

Далее, по традиции создаем пустышку с именем Language. И на эту пустышку кидаем скрипт Language.cs

Cоздаем пустышку с именем Language
Cоздаем пустышку с именем Language
-6
using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using UnityEngine;
public class Language : MonoBehaviour // Вешать на пустышку Language
{
#if UNITY_WEBGL
[DllImport("__Internal")]
private static extern string GetLang();
#endif
private void Awake()
{
#if UNITY_WEBGL && !UNITY_EDITOR
Global.language = GetLang();
#else
Global.language = "ru";
#endif
}
}

Все осталось совсем немного, а именно создать папку Yandex, в которой надо создать папку Plugins, и в которой уже создаем скрипт с таким вот расширением jslib. Назовем этот скрипт my.jslib

Создаем скрипт my.jslib
Создаем скрипт my.jslib
-8
mergeInto(LibraryManager.library, {

GetLang: function () {
try {
var lang = ysdk.environment.i18n.lang;
var bufferSize = lengthBytesUTF8(lang) + 1;
var buffer = _malloc(bufferSize);
stringToUTF8(lang, buffer, bufferSize);
return buffer;
} catch(err){
// взять язык с браузера
return navigator.language;
}
}
});

Главное, учтите в скрипте my.jslib не делайте лишних запятых или точек, он должен быть в точь-точь как у меня.

Если же у вас уже есть подобный скрипт, к примеру, для вызова реклама, тогда надо ставить запятую в вашем методе, а далее вставлять уже GetLang

GetLang: function () {

try {

var lang = ysdk.environment.i18n.lang;

var bufferSize = lengthBytesUTF8(lang) + 1;

var buffer = _malloc(bufferSize);

stringToUTF8(lang, buffer, bufferSize);

return buffer;

} catch(err){

// взять язык с браузера

return navigator.language;

}

}

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

По сути все. Все должно работать.

Для тех кому надо еще определение на какой платформе запущена игра (ПК или телефон), советую скачать скрипт с сайта github.com

Вот ссылка https://github.com/RimuruDev/Unity-WEBGL-DeviceTypeDetector?ysclid=m7mzjkkx57564887342

Там есть описание как его подключить, сложного ничего нету. Я лично создал еще один скрипт Device.cs, в котором убирал управление машиной стрелками на ПК, подключал джойстик, если мобила. А также убирал кнопки мобилы, если запущена игра на ПК. Все это в методе Awake().

-9
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Device : MonoBehaviour
{
public CarController m_CarController;
public Pulemet m_Pulemet;
public GameObject deviceMobile;
private void Awake()
{
if (GetComponent<DeviceTypeDetector>().CurrentDeviceType == CurrentDeviceType.WebMobile)
{
// Логика для мобильных устройств
m_CarController.isWebPC = false;
m_Pulemet.isMouse = false;
deviceMobile.SetActive(true);
Global.contDevice = "Mobile";
}
else
{
// Логика для ПК
m_CarController.isWebPC = true;
m_Pulemet.isMouse = true;
deviceMobile.SetActive(false);
Global.contDevice = "PC";
}
//StartDevice();
}
private void StartDevice() // Нужен для проверки потом удалить
{
if (Global.contDevice == "Mobile")
{
m_CarController.isWebPC = false;
m_Pulemet.isMouse = false;
deviceMobile.SetActive(true);
}
if (Global.contDevice == "PC")
{
m_CarController.isWebPC = true;
m_Pulemet.isMouse = true;
deviceMobile.SetActive(false);
}
}
}

Тут Global.contDevice, мне нужен для определения, какое обучение показывать, для ПК или мобилы.

Метод StartDevice(), нужен для проверки в редакторе, все работает как надо или нет? Чтобы его использовать, нужно конечно его разкомментировать, а в скрипте Global, указать contDevice = "Mobile" или contDevice = "PC". После проверки оставить в скрипте Global как было до этого (удалить Mobile или PC). Главное не забудьте когда будете делать билд, закомментировать снова метод StartDevice(), или удалите его вообще.

Главное друзья! Не забудьте изменить Index.html

Путь https://yandex.ru/games/sdk/v2 устарел. Чтобы ваша игра успешно прошла модерацию, укажите актуальный путь для подключения SDK Яндекс.

Добавьте в заголовок head HTML-страницы строку следующего вида:

<!-- Yandex Games SDK -->
<script src="https://sdk.games.s3.yandex.net/sdk.js"></script>

А вот этот кусок кода я вставлял в свою игру, тоже в index.html

<script>

YaGames

.init()

.then(ysdk => {

console.log('Yandex SDK initialized');

window.ysdk = ysdk;

initPlayer();

});

var player;

function initPlayer() {

ysdk.getPlayer({ scopes: false }).then(_player => {

player = _player;

}).catch(err => {

// Ошибка при инициализации объекта Player.

});

}

</script>

Надеюсь, статья вам была полезна!!! Если возникли вопросы, пишите в комментарии.

Как сделать метод автоматического определения языка с помощью i18.lang по этой статье, я реализовал в моей браузерной игре «Битва машин в пустоши».

Битва машин в пустоши (от IDgamesBJ) - играть онлайн бесплатно на сервисе Яндекс Игры

Информацию по моим играм можно посмотреть на сайте https://vk.com/public199787643