Написание квестов
Начальный Обновлено 9 июл. 2026 г.
Содержание
Квест целиком живёт в одном файле .quest.yaml. Файл является источником истины: Studio компилирует
его в ассеты, а вкладка Quest служит лишь его представлением; правка вручную и правка в конструкторе
всегда эквивалентны. Эта страница проходит по формату; полный справочник по каждому полю
(написанный так, чтобы заодно служить промптом для ИИ) доступен для
скачивания.
Где лежат файлы
Кладите квесты в <Project>/Content/Quests/, и они появятся в библиотеке Studio автоматически.
Называйте их <Name>.quest.yaml, один квест на файл.
Минимальный скелет
quest: Region.MyQuest # unique id/slug (required)
name: "My Quest"
giver: Bran # speaker key of the NPC who gives it
source_culture: en
steps: # required, at least 1
- id: MyQuest_Offer
scene:
speakers: [Bran, Player]
lines:
- { by: Bran, id: greet, text: "Hello.", emotion: neutral }
- { by: Player, id: hi, text: "Hi." }
choices:
- { id: accept, text: "I'll help.", goto: MyQuest_Do }
on_end: { quest: accept }
- id: MyQuest_Do
end: completed
Золотые правила
- Стабильные id в нижнем регистре у каждой реплики, выбора и цели. По id ключуются локализация и сгенерированные ассеты голоса и лица; вставка нового контента никогда не должна перенумеровывать существующие id.
- Используйте только документированные поля, эмоции, планы, виды условий и глаголы эффектов. Валидатор ловит всё, что выходит за рамки контракта, с переходом к источнику по каждой находке.
- Каждое значение GameplayTag должно быть зарегистрировано в проекте (нативно в C++ или в
DefaultGameplayTags.ini). Незарегистрированный тег молча не срабатывает; отсюда причина №1 жалобы «моя цель не засчитывается». См. Цели и прогресс.
Шаги
Шаг представляет собой один узел квеста: сцену диалога, отслеживаемую цель или терминальный маркер.
| Поле | Назначение |
|---|---|
id | Обязателен, стабилен. Автоматически получает пространство имён <ShortQuest>_<id>. |
scene | Сцена диалога (реплики + выборы) |
objective | Отслеживаемая цель: убить / собрать / добраться / поговорить / доставить |
next | Переход к следующему шагу по умолчанию (когда в сцене нет выборов) |
end | Терминальный маркер: completed, declined или failed |
require | Условие входа: например, пустить на шаг сдачи квеста только после выполнения цели |
Сцены: реплики и выборы
scene:
speakers: [Bran, Mira, Player] # every speaker key present in this scene
lines:
- { by: Bran, id: greet, text: "Come here.", emotion: worried, shot: cu }
- { by: Mira, id: warn, text: "Don't trust him.", to: Player }
- { by: Player, id: what, text: "What's wrong?" }
choices:
- { id: help, text: "I'll help.", goto: MyQuest_Accept }
- { id: refuse, text: "Not my problem.", goto: MyQuest_Refuse }
on_end: { quest: accept }
Сцена поддерживает любое число говорящих: перечислите все ключи в speakers и задайте
by у каждой реплики. В рантайме каждый ключ привязывается к актору, уже размещённому на
уровне, либо, если такого нет, к заспавненному по карте говорящих, записанной этапом Cast, и
поставленному рядом с квестодателем. Заспавненные персонажи автоматически убираются по
окончании диалога.
Полезные поля реплики:
to:указывает, кому адресована реплика; управляет кадрированием «через плечо» и поворотом головы в сценах с 3+ говорящими.emotion:принимает одно из значенийneutral,happy,sad,angry,afraid,surprised(плюс алиасы вродеworried→afraid). Управляет аддитивным лицевым настроением и тоном озвучки.shot:выбирает план:auto(по умолчанию; компилятор кадрирует сцену сам),wide,ots,cu,reactionили id пользовательской метки камеры (см. Постановку и камеры).echo_of:означает, что реплика повторяет текст выбора; укажите id выбора, чтобы они делили один ключ локализации.
Выборы могут проверять и выдавать GameplayTag: require: делает выбор доступным, только если
у игрока есть тег(и), grant: выдаёт теги при выборе.
Динамический текст
Текст поддерживает плейсхолдеры {PlayerName} и пользовательские {Token}, подставляемые в
момент отображения безопасным для локализации способом. О том, как задавать значения токенов
из игры, см. Интеграцию с рантаймом.
Авторинг с ИИ-ассистентом
Самый быстрый путь — готовый GPT
Questwright Quest Builder:
он уже знает формат, так что просто опишите завязку («смотритель маяка просит игрока найти его
пропавшего брата») — и получите готовый .quest.yaml.
Предпочитаете другого ассистента? Полный справочник формата намеренно самодостаточен: вставьте
файл справочника в ChatGPT или Claude вместе с
вашей завязкой и попросите .quest.yaml.
В любом случае положите результат в Content/Quests/: валидатор поймает любые отклонения от
контракта ещё до того, как они дойдут до сборки.