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

Reading Mode

Этап 2. Квесты и Задания

В прошлых этапах мы писали лишь голый текст. Текстом можно рассказать многое, но для игры почти всегда этого недостаточно. Надо бы добавить хоть какое-то взаимодействия квестов и мира. На этом Этапе мы этому как раз и научимся

Если вы используете ПК и всё еще не установили Visual Studio Code + XML от RedHat, то обязательно установите, иначе дальше с Блокнотом будет очень больно.

Глава 8. Убей моба и Авто-опции

Шаг 1. Авто-опции

Ранее прогрессия квеста продвигалась только с помощью нажатия кнопки. Теперь же сделаем так, чтобы квест двигался сам. Например, говорит NPC: «Убей паука», Игрок убивает и квест сам автоматически переходит на следующий шаг

Для подобной автопрогрессии используются Авто-опции (<option auto="имя_шага"/>)

Авто-опции – опция, которая скрытно в фыоне проверяет выполнения условия, заданного внути неё. Текста и кнопок в ней нет. На заданный шаг переходит только если все вложенные условия выполнены

Если представить, что кнопка (to="шаг") – это дверной звонок, который игрок сам нажимает, то авто-опция (auto="шаг") – это датчик движения: он сам замечает, когда условие выполнено, и сам открывает дверь.

Напомню, что кнопка выглядит так:
<option to="имя_шага" text="Текст"/>

Авто-опция выглядит так:
<option auto="имя_шага"/>

Как видите, у авто-опций нет text="_", потому что он им и не нужон. Эта опция выполняется скрытно в фоне

Шаг 2. Меняем порядок шагов

Откроем наш MyQuest.xml и для удобства поменяем порядок шагов. Также разделим с помощью пустых строк шаги, ведущие на #end и #end_dark_side, а также переименуем для удобства my_first_step в good_mood_step

Было:

<?xml version="1.0" encoding="UTF-8"?>
<quest npc="Wizard" title="Мой Первый Квест ">
ㅤ <step id="#start">
ㅤ ㅤ <intro>Привет, как дела?</intro>
ㅤ ㅤ <desc>Рад тебя снова видеть! Как дела?</desc>

ㅤ ㅤ <option to="bad_mood_step" text="Плохо"/>
ㅤ ㅤ <option to="my_first_step" text="Норм"/>
ㅤ </step>

ㅤ <step id="my_first_step">
ㅤ ㅤ <intro>Это хорошо, что хорошо. Пока, Наездник Дракона!</intro>
ㅤ ㅤ <desc>Снова ты? Я занят, не могу говорить. Пока!</desc>

ㅤ ㅤ <option to="#end" text="Пока"/>
ㅤ ㅤ <option to="#start" text="Назад"/>
ㅤ </step>

ㅤ <step id="bad_mood_step">
ㅤ ㅤ <intro>Очень жаль! Крепись там. Удачи, Наездник Дракона!</intro>
ㅤ ㅤ <desc>Понимаю, что тебе сейчас не хорошо, но у меня сейчас нет времени на разговоры</desc>

ㅤ ㅤ <option to="#end_dark_side" text=":("/>
ㅤ ㅤ <option to="#start" text="Назад"/>
ㅤ </step>

ㅤ <step id="#end">
ㅤ ㅤ <desc>Прощай, Наездник Дракона! Рад был повидаться</desc>

ㅤ ㅤ <option to="#start" text="Назад"/>
ㅤ ㅤ <option to="#close" text="Пока"/>
ㅤ </step>

ㅤ <step id="#end_dark_side">
ㅤ ㅤ <desc>Я... я тебя понимаю, Наездник Дракона. Крепись, я верю в тебя, а теперь прощай!</desc>

ㅤ ㅤ <option to="#start" text="Назад"/>
ㅤ ㅤ <option to="#close" text=". . ."/>
ㅤ </step>
</quest>

Стало:

<?xml version="1.0" encoding="UTF-8"?>
<quest npc="Wizard" title="Мой Первый Квест ">
ㅤ <step id="#start">
ㅤ ㅤ <intro>Привет, как дела?</intro>
ㅤ ㅤ <desc>Рад тебя снова видеть! Как дела?</desc>

ㅤ ㅤ <option to="bad_mood_step" text="Плохо"/>
ㅤ ㅤ <option to="good_mood_step" text="Норм"/>
ㅤ </step>

ㅤ <step id="good_mood_step">
ㅤ ㅤ <intro>Это хорошо, что хорошо. Пока, Наездник Дракона!</intro>
ㅤ ㅤ <desc>Снова ты? Я занят, не могу говорить. Пока!</desc>

ㅤ ㅤ <option to="#end" text="Пока"/>
ㅤ ㅤ <option to="#start" text="Назад"/>
ㅤ </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="#end_dark_side" text=":("/>
ㅤ ㅤ <option to="#start" text="Назад"/>
ㅤ </step>

ㅤ <step id="#end_dark_side">
ㅤ ㅤ <desc>Я... я тебя понимаю, Наездник Дракона. Крепись, я верю в тебя, а теперь прощай!</desc>

ㅤ ㅤ <option to="#start" text="Назад"/>
ㅤ ㅤ <option to="#close" text=". . ."/>
ㅤ </step>
</quest>

Отлично. На два логических блока (ведущий к #end и ведущий к #end_dark_side) квест разделили

Шаг 3. Добавляем шаг с заданием

Пока что добавим только сам шаг и блок текста к нему:

<?xml version="1.0" encoding="UTF-8"?>
<quest npc="Wizard" title="Мой Первый Квест ">
ㅤ <step id="#start">
ㅤ ㅤ . . .
ㅤ </step>

ㅤ <step id="spider_hunt_step">
ㅤ ㅤ <desc>Хорошо. Попробуй убить парочку пауков для разминки</desc>
ㅤ </step>

ㅤ <step id="#end">
ㅤ ㅤ . . .
ㅤ </step>

. . .

</quest>

Шаг 4. Добавляем Кнопку

Чтобы человек мог закрыть диалог, добавим кнопку:

<?xml version="1.0" encoding="UTF-8"?>
<quest npc="Wizard" title="Мой Первый Квест ">
ㅤ <step id="#start">
ㅤ ㅤ . . .
ㅤ </step>

ㅤ <step id="spider_hunt_step">
ㅤ ㅤ <desc>Хорошо. Попробуй убить парочку пауков для разминки</desc>
ㅤ ㅤ <option to="#close" text="Ок"/>
ㅤ </step>

ㅤ <step id="#end">
ㅤ ㅤ . . .
ㅤ </step>

. . .

</quest>

Шаг 5. Добавляем Авто-опцию

Теперь добавляем авто-опцию, проверяющую убийство 2 пауков. Для этого внутри <option> вложим <kill> с атрибутами.

Важно: Авто-опции пишем под кнопками, желательно также разделить авто-опции и кнопки-опции пустой строкой:

<?xml version="1.0" encoding="UTF-8"?>
<quest npc="Wizard" title="Мой Первый Квест ">
ㅤ <step id="#start">
ㅤ ㅤ . . .
ㅤ </step>

ㅤ <step id="spider_hunt_step">
ㅤ ㅤ <desc>Хорошо. Попробуй убить парочку пауков для разминки</desc>

ㅤ ㅤ <option to="#close" text="Ок"/>

ㅤ ㅤ <option auto="after_hunt_step" check="0.5">
ㅤ ㅤ ㅤ <kill enemy="Spider" count="2">
ㅤ ㅤ </option>
ㅤ </step>

ㅤ <step id="#end">
ㅤ ㅤ . . .
ㅤ </step>

. . .

</quest>

Шаг 6. Пояснение

<option auto="after_hunt_step"> – невидимый автоматический контролёр убиств пауков. После выполненяи условия (убийство 2 пауков) переходит на шаг after_hunt_step

check="0.5" – раз во сколько секунд проверять выполнение условия. В данном случае, проверка каждые полсекунды. Дробная и целая части разделяются ТОЧКОЙ, а не запятой, иначе сломаете квест

Правильно: check="0.5"
Неправильно: check="0,5"

</option> – закрывающая часть (крышка) <option>

Когда условие будет выполнено, игрок будет переброшен на шаг after_hunt_step

<kill enemy="Spider" count="2"> – условие: убить 2 пауков.

  1. enemy – системное имя моба (см. в GigaListBS.xlsx)
  2. count – сколько убить

Шаг 7. Добавляем after_hunt_step

Простой шаг с кнопкой «Ок», ведущей на #end

<?xml version="1.0" encoding="UTF-8"?>
<quest npc="Wizard" title="Мой Первый Квест ">
. . .
ㅤ <step id="spider_hunt_step">
      . . .
ㅤ </step>

  <step id="after_hunt_step">
      <desc>Отлично!Ты справился</desc>
   
      <option to="#end" text="Ок"/>
    </step>


ㅤ <step id="#end">
ㅤ ㅤ . . .
ㅤ </step>

. . .

</quest>

Шаг 8. Меняем good_mood_step

В этом шаге изменим текстовые блоки (desc, intro) и текст кнопки «Пока»:

В intro заменим последнее предложение на: У меня есть одно плёвое заданьеце для тебя. Готов ли его выполнить?

В desc заменим 2 последних предложения на: Моё предложение всё ещё актуально. Готов приступить?

В первой кнопке (<option to="#end" text="Пока"/>):

  1. Заменим "#end" в to на новый шаг spider_hunt_step
  2. Заменим «Пока» в text на «Да»

Получается: <option to="spider_hunt_step" text="Да"/>

Итоговый код good_mood_step:

ㅤ <step id="good_mood_step">
ㅤ ㅤ <intro>Это хорошо, что хорошо. У меня есть одно плёвое заданьеце для тебя. Готов ли его выполнить?</intro>
ㅤ ㅤ <desc>Снова ты? Моё предложение всё ещё актуально. Готов приступить?</desc>

ㅤ ㅤ <option to="spider_hunt_step" text="Да"/>
ㅤ ㅤ <option to="#start" text="Назад"/>
ㅤ </step>

Шаг 9. Проверяем

Шаг 10. Кнопка «Назад» и сломанные счетчики

Как видите, если через кнопку «Назад» попытаться повторно пройти задание на убийство пауков, то шаг с выдачей этого задания (spider_hunt_step) автоматически пропускается. Видно, как текст появляется на секунду и тут же диалог переходит на следующий шаг after_hunt_step.

Происходит это потому что Счетчик убийств привязан не к шагу, а ко всему квесту. То бишь, он НЕ сбрасывается после перехода на следующий шаг. В шаге spider_hunt_step мы убили 2 пауков, счетчик записал: «убито 2/2 пауков» и передал это авто-опции, авто-опция перешла на следующий шаг.

Когда мы снова пытаемся повторно перейти на шаг spider_hunt_step, счетчик СРАЗУ же передает авто-опции, что квест выполнен, так как убито 2/2 пауков, соответсвенно авто-опция моментально перебрасывает игрока на следующий шаг, что и видно на видео выше.

Заключение

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

Итоговый код Главы

<?xml version="1.0" encoding="UTF-8"?>
<quest npc="Wizard" title="Мой Первый Квест">  

  <step id="#start">
      <intro>Привет, как дела?</intro>
      <desc>Рад тебя снова видеть! Как дела?</desc>
 
      <option to="bad_mood_step" text="Плохо"/>
      <option to="good_mood_step" text="Норм"/>
    </step>

  <step id="good_mood_step">
      <intro>Это хорошо, что хорошо. У меня есть одно плёвое заданьеце для тебя. Готов ли его выполнить?</intro>
        <desc>Снова ты? Моё предложение всё ещё актуально. Готов приступить?</desc>

      <option to="spider_hunt_step" text="Да"/>
      <option to="#start" text="Назад"/>
    </step>

  <step id="spider_hunt_step">
      <desc>Хорошо. Попробуй убить парочку пауков для разминки</desc>

        <option to="#close" text="Ок"/>

      <option auto="after_hunt_step">
          <kill enemy="Spider" count="2"/>
      </option>
    </step>

  <step id="after_hunt_step">
        <desc>Отлично! Ты справился</desc>

      <option to="#end" text="Ок"/>
    </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="#end_dark_side" text=":("/>
      <option to="#start" 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