[13.5] Создание Своих Квестов для Игры

Reading Mode

Глава 13. Расширенный Label

Было решено вынести работу с label в отдельную Главу, так как это поистине мощный и полезный текстовый блок. С ним можно очень много чего необычного сделать. В этой главе рассмотрим лишь несколько основных мест, где его можно применить.

Шаг 1. <label/> где угодно

Текстовый блок label можно размещать почти где угодно:

  1. В Диалогах
  2. В Журнале (там он единственный способ написать текст)
  3. На Экране
  4. В 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>

Где:

  1. x – размер текста по x (растягивание по горизонтали)
  2. y – размер текста по y (растягивание по вертикали
  3. Если 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>

Где:

  1. location="HUD" – Где вывести текст. В данном случае, вывести текст на Экран
  2. <persist/> – Остававить текст на Экране после закрытия Диалога.
  3. <rotation/> – Поворот текст в градусах. Против часовой стрелки – положительные координаты (90, 30…), По часовой – отрицательные (-90, -180…)
  4. <position/> – Позиция по XY, куда поставить текст. Отсчитывается по левому верхнему краю блока текста
  5. <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>), если собираетесь в диалогах использовать только его и будет вам счастье

Задание на закрепление

  1. Доработайте Задание №3 из Главы 12: Пока игрок собирает зелья, на экране висит «Цель: Зелье Маны и Зелье Здоровья», после выполнения, надпись усчезает. Текст можете оформить как угодно
  2. Поэкспериментируйте с позицией текста (тег <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>


2
0

Comments

  1. Northern_77
    Northern_77

    Отличный гайд, но осталось несколько вопросов:
    1) Куда делся раздел с кастомным магазином из прошлой версии руководства. В 13.5.0? Его больше нельзя кастомизировать?
    2) У Фуза в 13.5.0 есть свой магазин, следовательно, они тоже стали квестовыми НПС и для них можно делать кастомные квесты. Или нельзя?

    1
    0
    • Da-Damych
      Da-Damych

      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 только что обновил, просто изначально забыл добавить
      Из нюансов: У них пока что нет своего портрета, поэтому будет видно просто имя

      1
      0

Leave a Reply