Написание квестов

Начальный Обновлено 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

Золотые правила

  1. Стабильные id в нижнем регистре у каждой реплики, выбора и цели. По id ключуются локализация и сгенерированные ассеты голоса и лица; вставка нового контента никогда не должна перенумеровывать существующие id.
  2. Используйте только документированные поля, эмоции, планы, виды условий и глаголы эффектов. Валидатор ловит всё, что выходит за рамки контракта, с переходом к источнику по каждой находке.
  3. Каждое значение 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 (плюс алиасы вроде worriedafraid). Управляет аддитивным лицевым настроением и тоном озвучки.
  • 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/: валидатор поймает любые отклонения от контракта ещё до того, как они дойдут до сборки.