Этап 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 пауков.
enemy– системное имя моба (см. в GigaListBS.xlsx)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="Пока"/>):
- Заменим
"#end"вtoна новый шагspider_hunt_step - Заменим «Пока» в
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>
Отличный гайд, но осталось несколько вопросов:
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 только что обновил, просто изначально забыл добавить
Из нюансов: У них пока что нет своего портрета, поэтому будет видно просто имя