Глава 13. Расширенный Label
Было решено вынести работу с label в отдельную Главу, так как это поистине мощный и полезный текстовый блок. С ним можно очень много чего необычного сделать. В этой главе рассмотрим лишь несколько основных мест, где его можно применить.
Шаг 1. <label/> где угодно
Текстовый блок label можно размещать почти где угодно:
- В Диалогах
- В Журнале (там он единственный способ написать текст)
- На Экране
- В
row, в том числе среди иконок/рецептов
…и много где ещё.
Исключение: Нельзя размещать внутри desc/intro, то есть нельзя написать: <desc>Что-то <label>Бла-бла</label> там</desc>
Шаг 2. Подменяем desc/intro
В диалогах label выглядит как крупный шрифт. Очень полезно для заголовков, важных сообщений, дарматических моментов или выделения чего-либо.
Разница в размере между desc и label:

Код:
<desc>Это desc</desc><label>Это label</label>
desc/intro можно писать без label, а label без desc/intro – нет, иначе получим пустой экран.
Но тогда как мы подменим desc/intro, выведя игроку только label? Легко!
Для этого мы добавим <desc>, НО оставим его пустым:
<desc></desc>
В итоге получим:
<desc></desc><label>Это label</label>

К слову, можно сделать пустой label, тогда можно будет делать отступы. Особенно полезно будет в блоке info
<label></label>
Давайте сразу применим label в нашем квесте. В brew_health_potion_step вынесем из desc в label фразу: «Вот рецепт: »
Было:
<step id="brew_health_potion_step"><desc>Могу предложить тебе сварить Зелье Здоровья. Это должно помочь поднять тебе настроение.\nВот рецепт:</desc><recipe name="Health Potion" type="Cauldron" />. . .<option to="#close" text="Понял"/></step>

Стало:
<step id="brew_health_potion_step"><desc>Могу предложить тебе сварить Зелье Здоровья. Это должно помочь поднять тебе настроение.</desc>
<label>Вот рецепт:</label><recipe name="Health Potion" type="Cauldron" />. . .<option to="#close" text="Понял"/></step>

Шаг 3. <label/> в Диалоге
Также label можно писать где угодно в Диалоге. Расположение в диалоговом окне зависит от позиции в коде. Для примера, сделаем наглядную демонстрацию работы тега <row>.
Код всего шага:
<step id="row_test_step"><desc></desc><label>В одну строку</label><row><item name="Health Potion" count="1"/><item name="Mana Potion" count="1"/></row><label>В несколько строк</label><row><item name="Health Potion" count="10"/><item name="Health Potion" count="20"/></row><row><item name="Mana Potion" count="30"/><item name="Mana Potion" count="11"/></row>
<option to="#close" text="Ок"/>
</step>

Шаг 4. <label/> в <row/>
В row тоже можно размещать. Расположение в коде также влияет на расположение в строке, в общем, работа аналогична работе в step
Вернемся к нашему многострадальному brew_health_potion_step и допилим там нижний ряд с Котлом и ингредиентами
Было:
<step id="brew_health_potion_step"><desc>Могу предложить тебе сварить Зелье Здоровья. Это должно помочь поднять тебе настроение.</desc>
<label>Вот рецепт:</label><recipe name="Health Potion" type="Cauldron" /><row><item name="Cauldron" count="1"/><item name="Lilia Flower" count="1"/><item name="water" count="1"/><item name="Energy" count="1"/></row>. . .<option to="#close" text="Понял"/></step>

Стало:
<step id="brew_health_potion_step"><desc>Могу предложить тебе сварить Зелье Здоровья. Это должно помочь поднять тебе настроение.</desc>
<label>Вот рецепт:</label><recipe name="Health Potion" type="Cauldron" /><row><label>Скрафти Котел</label><item name="Cauldron" count="0"/><label>и помести:</label></row><row><item name="Lilia Flower" count="1"/><item name="water" count="1"/><item name="Energy" count="1"/></row>. . .</step>

Теперь у нас иконка идет между двумя блоками текста и получается: «Скрафти Котел {иконка котла} и помести:»
Шаг 5. Изменяем размер текста
Если вам кажется, что размер текстового блока label не подходящий, то вы всегда можете его изменить. Для этого используется вложенный тег <scale>
Записывать с label его можно по разному
В несколько строк:
<label><scale x="24" y="24"/>Тут ваш текст</label>
В одну строчку:
<label><scale x="24" y="24"/>Тут ваш текст</label>
Где:
- x – размер текста по x (растягивание по горизонтали)
- y – размер текста по y (растягивание по вертикали
- Если x=y (например, x=”24″ y=”24″), то текст будет нормальным
Если из вложенных тегов используете только <scale> и никакой больше, то можно записывать в одну. Если вложенных тегов несколько, то крайне рекомендуется записывать всё в несколько строк для вашего же удобства
В нашем brew_health_potion_step проблем с размером текста нет (никуда не вылезает, не занимает пол-экрана), поэтому давайте попробуем добавить разделитель желтого цвета между рецептом и Котлом с ингридиентами
Для этого мы сильно растянем «_» по X и перекрасим в желтый [FFFF00]:
<step id="brew_health_potion_step"><desc>Могу предложить тебе сварить Зелье Здоровья. Это должно помочь поднять тебе настроение.</desc><label>Вот рецепт:</label><recipe name="Health Potion" type="Cauldron" /><label><scale x="1000" y="8"/>[FFFF00]_[-]</label><row><label>Скрафти Котел</label><item name="Cauldron" count="0"/><label>и помести:</label></row><row><item name="Lilia Flower" count="1"/><item name="water" count="1"/><item name="Energy" count="1"/></row>. . .</step>

Шаг 6. <label/> на экране (HUD)
До этого момента, вся наша красота жила только внутри Диалогового окна. Закрыл диалог – всё исчезло.
Но что если мы хотим вывести игроку на экран какую-то информацию? Уведомления (notify) появляются лишь на несколько секунд, да и текста в них много не вставишь. Нужно, чтобы информация, как стикер, была прилеплена на экран и висела там столько, сколько нужно.
Благо, это возможно. У label для этого есть вложенный тег <persist/>, <rotation/> и <position>, а также атрибут location, точнее location="HUD"
Выглядит это чудо так:
<label location="HUD"><persist/><position x="0" y="100"/><scale x="24" y="24"/><rotation angle="0"/>Текст на экране</label>
Где:
location="HUD"– Где вывести текст. В данном случае, вывести текст на Экран<persist/>– Остававить текст на Экране после закрытия Диалога.<rotation/>– Поворот текст в градусах. Против часовой стрелки – положительные координаты (90, 30…), По часовой – отрицательные (-90, -180…)<position/>– Позиция по XY, куда поставить текст. Отсчитывается по левому верхнему краю блока текста<scale/>– Знакомый нам тег. Определяет растягивание по XY. Если X=Y, то текст выглядит нормально
Важно! label с <persist/> будет находиться на экране, пока игрок находиться на его шаге. Ушел с шага, где находиться этот label с <persist/> –> надпись сама исчезла с экрана. То есть буквально: «Держись на экране, пока игрок на твоём шаге»
Шаг 7. Лепим «стикеры»
Давайте прилепим наш label (без поворота, он нам не нужен) на экран у шага spider_hunt_step в ветке Хорошее Настроение:
<step id="spider_hunt_step"><desc>Хорошо. Попробуй убить парочку пауков для разминки. Также принеси мне яблочко, а то я уж больно проголодался</desc><item name="Apple" count="1"/><option to="#close" text="Ок"/><label location="HUD"><persist/><position x="0" y="100"/><scale x="24" y="24"/>[FFAA00]Цель:[-] 2 паука и яблоко</label>. . .</step>
Проверяем:
После перехода на следующий шаг (в нашем случае: after_hunt_step), текст с экрана исчезает:
Меняем угол через <rotation angle="90"/>, то есть поворот против часовой стрелки на 90 градусов

Теперь <rotation angle="-90"/>, то есть поворот по часовой стрелки на 90 градусов

Заключение
В этой Главе мы убедились, что label – настоящий универсальный солдат оформления. Он и крупным текстом быть может, и подписью с надписью, и на экран вывестись может, и сепаратором (разделителем) тоже способен быть. Главное, не забывайте добавлять пустой desc (<desc></desc>), если собираетесь в диалогах использовать только его и будет вам счастье
Задание на закрепление
- Доработайте Задание №3 из Главы 12: Пока игрок собирает зелья, на экране висит «Цель: Зелье Маны и Зелье Здоровья», после выполнения, надпись усчезает. Текст можете оформить как угодно
- Поэкспериментируйте с позицией текста (тег
<position/>), подвигайте его по X и Y координатам
Итоговый код Главы
<?xml version="1.0" encoding="UTF-8"?><quest npc="Wizard" title="Мой Первый Квест "><step id="#start"><intro>Привет, [FFAA00]как дела[-]?</intro><desc>[FFAA00]Рад[-] тебя снова видеть! Как дела?</desc><option to="bad_mood_step" text="[FF0000]Плохо[-]"/><option to="good_mood_step" text="[00FF00]Норм[-]"/></step><!-- Хорошее настроение --><step id="good_mood_step"><intro>Это хорошо, что хорошо.У меня есть одно плёвое заданьеце для тебя.Готов ли его выполнить?</intro><desc>Снова ты?\nМоё предложение всё ещё актуально.\nГотов приступить?</desc><optionto="spider_hunt_step" text="Да"><journal/></option><option to="#start" text="Назад"/></step><step id="spider_hunt_step"><desc>Хорошо. Попробуй убить парочку пауков для разминки. Также принеси мне яблочко, а то я уж больно проголодался</desc><item name="Apple" count="1"/><option to="#close" text="Ок"/><label location="HUD"><persist/><position x="-200" y="-300"/><scale x="24" y="24"/>[FFAA00]Цель:[-] 2 паука и яблоко</label><info><kill enemy="Spider" count="2"/><collect item="Apple" count="1"/><label>Яблоко: </label><item name="Apple" count="1"/></info><option auto="after_hunt_step"><kill enemy="Spider" count="2"/><collect item="Apple" count="1"/><notify>[00FF00]Задание выполнено![-] \nВернись к Волшебнику!</notify></option></step><step id="after_hunt_step"><desc>Отлично! Ты справился</desc><option to="spider_hunt_step" text="Уйти"/><option to="#end" text="Ок"><remove item="Apple" count="1"/></option><info><label>Вернись к Волшебнику и скажи, что ты убил всех пауков</label></info></step><step id="#end"><desc>Прощай, Наездник Дракона! Рад был повидаться</desc><option to="#start" text="Назад"/><option to="#close" text="Пока"/></step><!-- Плохое настроение --><step id="bad_mood_step" ><intro>Очень жаль! Крепись там</intro><desc>Понимаю, что тебе сейчас не хорошо, крепись там!</desc><option to="brew_health_potion_step" text=":("><journal/></option><option to="#start" text="Назад"/></step><step id="brew_health_potion_step"><desc>Могу предложить тебе сварить Зелье Здоровья. Это должно помочь поднять тебе настроение.</desc><label>Вот рецепт:</label><recipe name="Health Potion" type="Cauldron" /><label><scale x="1000" y="8"/>[FFFF00]_[-]</label><row><label>Скрафти Котел</label><item name="Cauldron" count="0"/><label>и помести:</label></row><row><item name="Lilia Flower" count="1"/><item name="water" count="1"/><item name="Energy" count="1"/></row><info><label>Свари Зелье Здоровья по рецепту: </label><recipe name="Health Potion" type="Cauldron" /><label>Относить Волшебнику его [FF0000]не нужно[-]</label><label>Для приготовления потребуются: </label><item name="Cauldron" count="1"/><item name="Lilia Flower" count="1"/><item name="water" count="1"/><item name="Energy" count="1"/></info><option to="#close" text="Понял"/></step><step id="#end_dark_side"><desc>Я... я тебя понимаю, Наездник Дракона. Крепись, я верю в тебя, а теперь прощай!</desc><option to="#start" text="Назад"/><option to="#close" text=". . ."/></step></quest>
Отличный гайд, но осталось несколько вопросов:
1) Куда делся раздел с кастомным магазином из прошлой версии руководства. В 13.5.0? Его больше нельзя кастомизировать?
2) У Фуза в 13.5.0 есть свой магазин, следовательно, они тоже стали квестовыми НПС и для них можно делать кастомные квесты. Или нельзя?
1) Кастомные магазины полностью убраны (даже для Алхимика, Фуза и Крестьян). Теперь игра не будет подгружать квесты, содержащие в коде тег <store>
В логах будет писать:
Skipped custom quest ‘ИмяКвеста’ from file [Путь до XML-файла квеста]: NPC stores are not allowed in custom quests
UnityEngine.DebugLogHandler:Internal_Log(LogType, LogOption, String, Object)
UnityEngine.Logger:Log(LogType, Object)
UnityEngine.Debug:LogWarning(Object)
QuestManager:AddUserQuests(XmlSerializer, String)
d__77:MoveNext()
UnityEngine.SetupCoroutine:InvokeMoveNext(IEnumerator, IntPtr)
2) Да, для Фуза можно теперь тоже делать квесты. Список Квестовых NPC только что обновил, просто изначально забыл добавить
Из нюансов: У них пока что нет своего портрета, поэтому будет видно просто имя