Skip to content

Диалоговая система

Кривошея Михаил edited this page Oct 30, 2018 · 7 revisions

Содержание

Общее описание работы

Каждый диалог представляет собой экземпляр UDialogAsset. В этом ресурсе содержится дерево фраз и дополнительные параметры, такие как имя класса скрипта.

Кнопка создания диалога находится в разделе Gameplay контекстного меню Content Broweser

Для воспроизведения диалога необходимо создать новый экземпляр класса UDialogProcessor. Это можно сделать вызовом функции CreateDialogProcessor

При создании обработчика можно указать актера-собеседника, это может быть полезно для работы с собеседником из скрипта и вызова методов собеседника при воспроизведении фраз.

Для запуска диалога необходимо вызвать метод обработчика StartDialog. Запуск диалога привет к активации корневой ноды. При активации любой ноды вызовется событие OnShowPlayerPhrase или OnShowNPCPhrase в зависимости от того, кому принадлежит фраза. События сообщают какую фразу необходимо показать игроку.

Если после активированной фразы идут фразы игрока, то будет вызвано событие OnChangePhraseVariant, передающее краткую информацию для отображения варианта ответа игрока.

Для активации фразы игрока необходимо вызвать метод обработчика Next с ID фразы, которую нужно активировать. Фразы собеседника (НПС) будут активированы автоматически (активируется первая доступная на данный момент фраза. Если доступных фраз нет, то диалог завершается). При завершении диалога будет вызвано событие OnEndDialog

Диалоги тесно связанны с хранилищем ключей и менеджером триггеров

Фразы

Дерево фраз может состоять из нескольких типов узлов:

  • Корень
  • Фраза
  • Ссылка на другой диалог

Корень

Корень является точкой входа и не имеет ни каких дополнительных свойств. Может присутствовать в единственном экземпляре, не имеет выхода.

Фраза (UDialogPhraseNode)

Представляет собой часть диалога, содержит тест, звук и другую информацию для воспроизведения. Нода имеет вход и выход и может быть соединена с любыми другими нодами. Соединения могут быть цикличными, но нельзя соединить ноду саму с собой.

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

Фраза может содержать условия входа

  • Проверка наличия ключа CheckHasKeys
  • Проверка отсутствия ключа CheckDontHasKeys
  • Вызов предиката Predicate
    • Вызывать предикат в персонаже игрока (Например, проверка наличия предмета или денег)
    • Вызывать предикат в персонаже собеседника
    • Вызывать предикат в объекте найденном по тегу
    • Вызывать предикат в скрипте диалога

В вызываемый предикат можно передавать константные параметры.

Так же при активации фразы можно добавить или удалить ключи а так же вызвать функцию аналогично вызову предиката. Для этого в фразе предусмотрены поля GiveKeys, RemoveKeys, Action. Кроме того, фраза может начать выполнение задания, указанного в поле StartQuest.

Ссылка на другой диалог (UDialogSubGraphNode)

Представляет собой переход в другой UDialogAsset. Может быть полезно при вынесении общих для нескольких НПС фрагментов диалога. Уровень вложенности может быть любой.

На данный момент нода не имеет выхода, поэтому при завершении вложенного диалога завершится и основной.

Скрипт диалога ADialogScript

При необходимости выполнения сложной логики при проверке доступности фразы или ее активации, к диалогу можно прикрепить скрипт. Скриптом является экземпляр объекта, наследованный от ADialogScript. Экземпляр создается при вызове метода обработчика StartDialog и будет автоматически уничтожен после завершения диалога.

ADialogScript унаследован от AInfo и является вспомогательным актером размещаемым на сцене. Это позволяет использовать большинство Blueprint блоков внутри скрипта. Рекомендуется создать один базовый скрипт, содержащий все специфичные для игры функции и предикаты (Такие как проверка денег у игрока, передача предметов, активация анимации, спавн актеров, проверка времени суток и т.д.). После чего при необходимости добавить специфичную для конкретного диалога логику, наследоваться от базового скрипта.