Вот! Разговорный интерфейс для Энн Ахронист! Наверху у нас есть любой произносимый диалог, а также эмоционально заряженный портрет говорящего персонажа (арт-заполнитель любезно предоставлен game-icons.net) и его бирка с именем. Внизу у нас есть любые варианты диалога, доступные игроку.

Все это выглядит очень просто на первый взгляд, но кодирование этого было огромной проблемой. Девятифрагментные расширяемые поля пользовательского интерфейса не были слишком сложными, но я решил добавить эффект ввода текста, добавляя в строку по одной букве за раз, и это вызвало у меня бесконечные проблемы. Сначала я выровнял текст по верхнему левому краю, но, как видите, таким образом он не очень хорошо заполняет поле. Чтобы компенсировать это пустое место, я выровнял текст по центру поля, но это означало, что добавление одной буквы за раз к отображаемой строке будет постоянно сдвигать текущую строку влево все больше и больше, что приводит к довольно трудно читать побуквенную анимацию. Вместо этого я хотел, чтобы все буквы находились на своем конечном месте в том месте, где они появляются, и больше не перемещались. Для этого мне пришлось оставить строку такой же, как и в оригинале, вместо того, чтобы добавлять букву за буквой, а вместо этого менять, какие буквы действительно видны, а какие нет. Это означало добавление нескольких тегов ‹color=#000000› в саму строку для создания невидимого текста.

Следующая проблема? Мне нужны другие коды форматирования в моих строках, как показано в примере выше. Однако анимация хотела переместить тег ‹b›, используемый для выделения текста полужирным шрифтом, по одному символу за раз. Это означало, что знак «‹» был виден вплоть до закрывающего тега. Любое нарушенное форматирование также портило форматирование остальной части строки. Чтобы исправить это, любые обнаруженные открывающие теги должны были быть полностью перемещены с невидимой стороны на видимую сторону, в дополнение к следующей букве в строке (иначе каждый раз при перемещении тега возникала бы ненужная пауза). Мне также пришлось временно закрыть этот тег в конце видимой строки с любыми тегами, которые еще не были закрыты — если бы я открыл тег и никогда не закрывал его, Unity не смогла бы его проанализировать, и никакое форматирование не помогло бы. Работа.

Теперь все хорошо и хорошо, не так ли? Неправильный. Я также хотел использовать синтаксис с цветовой кодировкой, чтобы сосредоточить внимание игрока на ключевых словах, где это уместно. Но если бы я объявил, что какой-то текст на невидимой стороне строки должен быть определенного цвета, это переопределило бы «невидимый» цвет, который я ему уже присвоил! Это была большая головная боль. В итоге я решил эту проблему, удалив невидимую строку любых цветовых тегов и сохранив каждый из цветов по порядку в массиве, заменив их внутри строки определенным маркером. Всякий раз, когда приходило время переместить один из этих маркеров с невидимой на видимую сторону, он удалял маркер и вставлял следующую цветовую метку.

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