Как делать шрифты для TextMeshPro
TextMeshPro уже давно часть Unity и его можно бесплатно установить через пакетный менеджер. Не буду описывать все преимущества перед старым текстовым компонентом, это примерно как, сравнивать Блокнот и Word.
Шрифт который используется по-умолчанию поддерживает основные символы, но он обычный/скучный/дефолтный, примерно как китовый объектив у фотоаппарата 🙂 Чтобы добавить в свою игру новый красивый/необычный/яркий шрифт, надо проделать все пару операций.
TMP Font Creator
TMP Font Creator

Итак, что необходимо:
- Сам шрифт TTF (OTF), не забывайте про лицензию ☝️
- Unity с установленным TMP
- Набор символов или unicode range, который будете использовать
- Надо понимать, что во многих шрифтах может не быть необходимых символов
- У Google есть бесплатные Noto Fonts которые тоже немного скучные, но поддерживают все языки 🙂
- Добавляете файл шрифта в проект, открываете TMP Font Asset Creator и перетаскиваете его в поле Source Font File
- Теперь можно выбрать набор символов, для этого есть меню Character Set:
Select character set type for TMP
Select character set type for TMP

Всё что идёт до Custom Range — понятно, это разновидности ASCII и символы. После это опции где можно выбирать откуда брать символы: из файла, просто перечислить в поле, указать промежуток, последовательность и т. д.
- Выберем Unicode Range (HEX) и укажем, например 0020-007F — это базовые латинские символы, ренжи можно указывать через запятую
- Теперь можно нажать Generate Font Asset
Окно после настроек и генерации шрифта, должно выглядеть как-то так:
Complete font generation for TMP
Complete font generation for TMP

- Из указанного ренжа было добавлено 95 из 96 символов, не добавился 007F — ␡, его нет в этом шрифте.
- В результате, для атласа 512×512 получился Point Size = 69, потому что в настройках было указано Auto Sizing.
- Можно указать размер шрифта вручную, но тогда надо следить чтобы все влезли в атлас и при необходимости увеличить размер атласа.
- Также, можно разбить свои шрифты на несколько ассетов, например, сделать один (базовый) с часто используемыми символами, второй с математическими знаками, третий с армянским языком. И при необходимости TMP сам будет использовать нужный атлас. Для этого к базовому ассету нужно добавить поддержку остальных:
TMP fallback view
TMP fallback view

Как сделать поддержку Emoji в Unity, я уже писал. Ещё недавно на форуме один товарищ опубликовал свое решение проблемы с модификаторами в эмоджи. Напомню, что до сих не работают модификаторы, т. е. если вы сделаете атлас с эмоджи, то всякие флаги, цвет кожи и т. п. будут отображаться некорректно. Автор TMP обещал всё это допилить к версии 2019.3, но пока этого нет. Вариант с форума работает правильно.
Разные unicode ranges для создания своих шрифтов можно подглядеть тут.
Шрифт для TextMeshPro
Почему то не получается нормальный формат шрифта сохранить в TextMeshPro.
На латинице нормально, а на кириллице формат сбивается.
Если использовать «родной» шрифт ТМР, то все нормально:
Что можете посоветовать?
#1
20:04, 2 ноя 2022
Ulyp
> Что можете посоветовать?
Научиться
#2
20:04, 2 ноя 2022
#3
20:04, 2 ноя 2022
#4
20:05, 2 ноя 2022
#5
20:05, 2 ноя 2022
#6
20:05, 2 ноя 2022

#7
20:13, 2 ноя 2022
Подскажете, как рисунок вставить? Пробовал [img=] — херня получается.
#8
20:42, 2 ноя 2022
Ulyp
> Подскажете, как рисунок вставить? Пробовал [img=] — херня получается.
У тебя там где ты загрузил изображение есть прямо готовый тег tmpimg. Бери и копипасть оттуда.
- RikiTikiTak
- Постоялец
#9
22:41, 2 ноя 2022
Скачайте шрифт в котором точно есть кириллица и латиница, найдите в инете как создавать текстурные атласы для TextMeshPro и делайте точно так же. Вроде даже есть офф руководства Юнити.
#10
7:00, 3 ноя 2022
Надеюсь, ни у кого нет сомнений, что Times New Roman содержит кириллицу. Так вот, если пользоваться стандартным
Window -> TextMeshPro -> Font Asset Creator,
то почему то копирует только латиницу, оставляя кириллицу за бортом.
Выход нашел такой:
Идем в Project -> Assets -> Fonts.
Выделяем нужный нам шрифт и жмем Ctrl+Shift+F12.
Образуется новый шрифт (с добавкой SDF) и вот с ним будет все в порядке!
- RikiTikiTak
- Постоялец
#11
23:52, 3 ноя 2022
Если все было бы так легко то зачем народ заморачивался с Font Asset Creator. Там у шрифтов куча настроек, разрешений. Уже не помню точно, я это делал один раз пол года назад, но наверное кириллицу оставил за бортом наверное потому что диапазон неправильно указали. Вот с корейским шрифтом действительно было трудно.
Не разобравшись в этой проблеме идёте дальше, там на выходе у вас будет хороший такой багодром, если будете продолжать в таком духе.
#12
7:18, 4 ноя 2022
RikiTikiTak
> RikiTikiTak
> Если все было бы так легко то зачем народ заморачивался с Font Asset Creator.
> Там у шрифтов куча настроек, разрешений.

И где здесь куча?
Source Font, Point Size, Padding, Packing Method оставляем, не должны влиять.
Atlas Resolution пробовал даже 2048 делать — просто время генерации увеличивается.
Character Set все перепробовал, как и Render Mode — все без толку.
Галочка в Get Kerning Pairs тоже не помогает.
А больше и настроек то нет.
RikiTikiTak
> наверное кириллицу оставил за бортом наверное потому что диапазон неправильно
> указали
Был бы признателен, если бы указали правильный диапазон.
#13
12:01, 4 ноя 2022
Ulyp
> Был бы признателен, если бы указали правильный диапазон.
я использовал такой. может и тебе подойдет. 0020-007F,00AB,00BB,0400-04FF,2026
#14
12:12, 4 ноя 2022
И в каком месте их указывать?
Текст в Unity
Текст является одним из наиболее важных компонентов голографических приложений. Для отображения текста в Unity можно использовать три типа текстовых компонентов: текст пользовательского интерфейса, сетка трехмерного текста и текстовая сетка Pro. По умолчанию текст пользовательского интерфейса и сетка трехмерного текста выглядят размытыми и слишком большими. Изменение нескольких переменных приводит к более четкому, более качественному тексту с управляемым размером в HoloLens. Вы можете повысить качество отрисовки, применив коэффициент масштабирования для получения правильных измерений при использовании компонентов текста пользовательского интерфейса и сетки трехмерного текста.

Размытый текст по умолчанию в Unity
Работа с трехмерными текстами (сеткой текста) и текстом пользовательского интерфейса Unity
В Unity предполагается, что все новые элементы, добавленные в сцену, имеют один размер единицы Unity или масштаб 100 % преобразования. Одна единица Unity преобразуется примерно в 1 метр на HoloLens. Для шрифтов ограничивающий прямоугольник для 3D TextMesh по умолчанию имеет высоту около 1 метра.

3D-текст (сетка текста) по умолчанию в Unity занимает одну единицу Unity, которая составляет 1 метр
Большинство визуальных конструкторов используют точки для определения размеров шрифтов в реальном мире. Есть около 2835 (2834,64566639962) точек в 1 метре. На основе преобразования системы точек в 1 метр и размера шрифта Сетки текста Unity по умолчанию 13, простая математика 13, разделенная на 2835, равна 0,0046 (0,004586111116, чтобы быть точным), что обеспечивает хорошую стандартную шкалу для начала (некоторые могут округлить до 0,005). Масштабирование текстового объекта или контейнера до этих значений позволит не только преобразовывать размеры шрифтов 1:1 в программе разработки, но и обеспечит стандарт, позволяющий поддерживать согласованность во всем интерфейсе.

Масштабирование значений для 3D-текста и текста пользовательского интерфейса Unity

Сетка 3D-текста Unity с оптимизированными значениями
При добавлении пользовательского интерфейса или текстового элемента на основе холста в сцену разница в размерах еще больше. Различия в двух размерах примерно равны 1000 %, что приведет к тому, что коэффициент масштабирования для текстовых компонентов пользовательского интерфейса составляет 0,00046 (0,0004586111116, если быть точным) или 0,0005 для округленного значения.

Текст пользовательского интерфейса Unity с оптимизированными значениями
На значение по умолчанию любого шрифта может повлиять размер текстуры этого шрифта или способ импорта шрифта в Unity. Эти тесты были выполнены на основе шрифта Arial по умолчанию в Unity, а также другого импортированного шрифта.
Работа с Text Mesh Pro
С помощью Unity Text Mesh Pro можно обеспечить качество отрисовки текста. Он поддерживает четкие контуры текста независимо от расстояния с помощью метода подписанного поля расстояния (SDF). Используя тот же метод вычисления, который мы использовали выше для сетки трехмерного текста и текста пользовательского интерфейса, мы можем найти правильные значения масштабирования для использования с обычными типографическими точками. Так как шрифт 3D Text Mesh Pro по умолчанию с размером 36 имеет ограничивающий размер 2,5 единиц Unity (2,5 м), мы можем использовать значение масштабирования 0,005, чтобы получить размер точки. Размер текстовой сетки Pro в меню пользовательского интерфейса по умолчанию ограничен 25 единицами Unity (25 м). Это дает нам 0,0005 для значения масштабирования.

Масштабирование значений для текста и пользовательского интерфейса Unity 3D
Рекомендуемый размер текста
Как и следовало ожидать, размеры типов, которые мы используем на пк или планшете (обычно от 12 до 32 пт), выглядят небольшими на расстоянии 2 метров. Это зависит от характеристик каждого шрифта, но в целом рекомендуемый минимальный угол обзора и высота шрифта для удобочитаемости составляет около 0,35°-0,4°/12,21-13,97 мм на основе наших исследований пользователей. Это примерно 35-40 пт с коэффициентом масштабирования, представленным выше.
Для ближнего взаимодействия на 0,45 м (45 см) минимальный угол обзора и высота шрифта 0,4°-0,5°/3,14–3,9 мм. Это примерно 9-12 пт с коэффициентом масштабирования, представленным выше.

в ближнем и дальнем диапазоне взаимодействия
Минимальный размер разборчивого шрифта
| Расстояние | Угол обзора | Высота текста | Размер шрифта |
|---|---|---|---|
| 45 см (расстояние прямой манипуляции) | 0.4°-0.5° | 3,14–3,9 мм | 8.9–11.13pt |
| 2 м | 0.35°-0.4° | 12,21–13,97 мм | 34.63-39.58 pt |
Удобный размер удобочитаемого шрифта
| Расстояние | Угол обзора | Высота текста | Размер шрифта |
|---|---|---|---|
| 45 см (расстояние прямой манипуляции) | 0.65°-0.8° | 5,1–6,3 мм | 14.47-17.8 pt |
| 2 м | 0.6°-0.75° | 20,9–26,2 мм | 59.4-74.2 пт |
Segoe UI (шрифт по умолчанию для Windows) хорошо работает в большинстве случаев. Однако старайтесь не использовать светлые или полулегкие семейства шрифтов небольшого размера, так как тонкие вертикальные штрихи будут вибрировать и ухудшать разборчивость. Современные шрифты с достаточной толщиной штриха хорошо работают. Например, Helvetica и Arial выглядят великолепно и разборчивы в HoloLens с регулярными или смелыми весами.

Расстояние, угол и высота текста
Текст с помощью набора средств Смешанная реальность версии 2
Качество отрисовки резкого текста с правильным измерением
На основе этих факторов масштабирования мы создали заготовки текста с текстом пользовательского интерфейса и сеткой трехмерного текста. Разработчики могут использовать эти заготовки для получения четкого текста и согласованного размера шрифта.

Качество отрисовки резкого текста с правильным измерением
Шейдер с поддержкой окклюзии
Материал шрифта по умолчанию в Unity не поддерживает загораживание. По этой причине вы увидите текст за объектами по умолчанию. Мы добавили простой шейдер, поддерживающий окклюзию. На рисунке ниже показан текст с шрифтом по умолчанию (слева) и текстом с правильной окклюзией (справа).

Шейдер с поддержкой окклюзии
Следующий этап разработки
Если вы следите за путь разработки Unity, который мы изложили, вы находитесь в разгаре изучения основных стандартных блоков MRTK. Отсюда вы можете перейти к следующему стандартному блоку:
Или перейдите к возможностям и API платформы смешанной реальности:
Вы можете в любой момент вернуться к этапам разработки для Unity.
См. также раздел
- Заготовка текста в MRTK
- Оформление текста
Как добавить шрифт в TextMeshPro в Unity?
Перетаскиваете ваш шрифт в Unity. Затем Window — Text Mesh Pro — Font Asset Creator. В верхнем поле выбираете шрифт и жмёте Generate Font Atlas и выбираете папку куда сохранить ассет. Если нужно с кириллицей, то в поле Character Set выбираем Unicode Range (Hex) и в поле ниже прописываем 0400-04ff, если нужно ещё с английскими буквами, символами и цифрами, то 0000-04ff
Отслеживать
ответ дан 5 мар 2022 в 11:26
JunEternal JunEternal
1 1 1 бронзовый знак
- c#
- unity3d
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.1.9.3159
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.