Unity справа налево

Unity справа налево

Оказывается, на Ближнем Востоке и в Северной Африке тоже любят видеоигры. Согласно исследованию, в 2020 году только в Саудовской Аравии, Иране и Объединенных Арабских Эмиратах в сумме оказалось больше 68 млн геймеров, а размер рынка видеоигр в этих странах составил внушительные 2 млрд долларов! Однако знанием английского языка жители ближневосточных государств похвастаться не могут: по классификации EF EPI их средний уровень оценивается как «низкий» или даже «очень низкий». Что ж, у разработчиков и издателей видеоигр есть хороший повод задуматься над тем, чтобы локализовать свои проекты для этого региона.

Египтян, марокканцев, иранцев, пакистанцев и сирийцев объединяет многое. В частности, письменность: в их родных языках она основана на арабской графике. Затейливая вязь используется в двух десятках стран от Атлантики до Гималаев.

На первый взгляд, разработчику и локализатору иметь дело с таким письмом не сложнее, чем с корейским хангылем или японской каной. Берем нужные слова (например, «Новая игра», «Настройки», «Выход»), переводим их на арабский (например, , , ) и подставляем в свой проект Unity. Получается вот так:

Красиво, но ничего не понятно, правда? В этом мы не одиноки: наши арабские игроки тоже ничего не поймут. Если приглядимся, то заметим, что выданный Unity текст совсем не похож на тот, что прислал нам переводчик. И это проблема.

Дело в том, что по умолчанию Unity не знает, что такое арабская графика. В этой системе письменности принят непривычный для нас порядок слов — справа налево, а все буквы одного слова соединяются между собой (за редким исключением). Однако Unity выводит арабские символы слева направо и никак их не соединяет, будто имеет дело с обычным европейским алфавитом.

Чтобы решить эту проблему, придется потрудиться. Для начала немного истории.

Первым инструментом для создания текста в Unity были компоненты GUI Text. Они выводили на экран двухмерный текст, а шрифтовыми ресурсами для них служили обычные файлы формата TTF.

Однако функций стандартных компонентов было недостаточно, чтобы сделать по-настоящему красивые надписи, поэтому разработчики Unity придумали компоненты TextMesh. Это строки текста в виде трехмерной сетки (иногда ее называют просто «мэш»), которая генерируется из обычных шрифтовых файлов формата TTF.

Разумеется, вскоре появились желающие улучшить такой полезный инструмент. Один из желающих, сторонний разработчик Digital Native Studios, создал плагин TextMesh Pro. Этот плагин тоже генерирует шрифтовые ресурсы на основе файлов TTF (а также OTF), при этом каждый шрифтовой ресурс состоит из материала, текстуры и таблицы символов. Полученные таким образом текстовые компоненты можно как угодно масштабировать и поворачивать без потери качества, а также добавлять к ним разнообразные визуальные эффекты (например, тени и контур). Более того, новые компоненты могут взаимодействовать с окружающей средой, отражая свет от близлежащих источников.

Плагин TextMesh Pro оказался настолько удачным решением, что был включен в состав Unity (начиная с версии Unity 2018.1). Как раз этим плагином мы и воспользуемся.

Однако один лишь TextMesh Pro нашу проблему не решит: изменять направление следования букв он умеет, но соединять их внутри слов пока не научился. Нам нужна еще одна надстройка. На данный момент создано несколько плагинов для письма справа налево: Easy Alphabet Arabic, Arabic Support, RTLTMPro и т. д.

Самое продвинутое решение — плагин Easy Alphabet Arabic. Он поддерживает все элементы графического интерфейса в Unity: кнопки, текстовые поля, поля ввода и т. п. Поддерживает все символы современного арабского, урду, персидского, уйгурского, а также некоторые символы пушту, курдского и синдхи. Стоит 20 долларов.

Рассмотрим подробнее работу с бесплатным и весьма умелым плагином RTLTMPro (что значит Right-to-Left TextMesh Pro — «TextMesh Pro для письма справа налево»).

1. Установим необходимые плагины: TextMesh Pro, а затем — пакет с последним релизом RTLTMPro с его страницы на GitHub.
2. Скопируем в буфер обмена коды Unicode нужных нам арабских знаков: букв, цифр и символов ташкиль (огласовки, то есть транскрипции). Они лежат в файлах LetterRanges.txt, NumberRanges.txt и TashkilRanges.txt пакета RTLTMPro, соответственно.
3. Если мы еще не умеем создавать шрифтовые ресурсы TextMesh Pro, то самое время научиться:
i. Импортируем файл нужного нам шрифта формата OTF или TTF (разумеется, он должен поддерживать арабские символы), перетащив его на панель Assets в Unity.
ii. Вызываем Window > TextMeshPro > Font Asset Creator.
iii. Перетаскиваем файл шрифта в поле Source Font File.
iv. Копируем в поле Character Sequence (Hex) нужные нам Unicode-диапазоны арабских символов (например, основной набор знаков 0600—06FF).
v. Нажимаем Generate Font Atlas.
vi. Нажимаем Save.

Шрифтовой ресурс TextMesh Pro готов. Он сохранился в папку с исходными файлами шрифта.

4. Создаем в сцене текстовые объекты, используя элементы из пакета RTLTMPro (их можно найти там же, где и стандартные элементы интерфейса: GameObject > UI > [тип элемента] — RTLTMP).
5. Каждому новому текстовому объекту назначаем шрифтовой ресурс, который мы сгенерировали в шаге 4.
6. Добавляем перевод, и наш текст преображается:

Совсем другое дело! Все буквы внутри одного слова соединены как надо, слова стоят в правильном порядке, а наши арабские игроки наконец смогут оценить игру по достоинству.