Создание редактора квестов и диалогов для Unreal engine: Часть 1 описание плагина

в 13:37, , рубрики: c++, editor, QuEST, system, Unreal Engine, Программирование, разработка игр, система диалогов

image

Здравствуйте меня зовут Дмитрий. Я занимаюсь созданием компьютерных игр на Unreal Engine в качестве хобби.

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

Я решил разделить статью на две части в первой части я опишу сам плагин и расскажу как им пользоваться. А во второй части я расскажу про технически аспекты.

Поэтому я перейду сразу к рассказу о самом плагине. Для начала нужно создать ассет StoryGraph. На панели справа вы создаете сюжетные объекты это могут быть:

1)Quest — Это ваши квесты после создания этого объекта появляется возможность добавить стартовую ноду квеста(поддерживается drag and drop) к которой можно уже привязывать фазы квеста.

2)Character — Персонаж это объект который содержит внутри себя ещё один граф, это редактор диалогов этого персонажа. Кроме того объект персонаж имеет внешнюю ссылку на объект ACharecter_StoryGraph это производный объект от ACharecter. Персонаж имеет несколько состояний это Alive(живой) и Dead(мертвый) эти состояния можно считать (Об этом далее). В эти состояния его как-раз и переключает ACharecter_StoryGraph. Персонаж может получать сообщения от главного графа.

3)PlaceTrigger — Триггер это итерактивный объект который можно встретить на карте. Тоже имеет внешние ссылки на объект APlaceTrigger_StoryGraph который является производным от AActor. Триггер как и персонаж имеет внутри себя редактор сообщений за счет котрого можно с ним взаимодействовать.

Триггер имеет всего два состояния активен и неактивен. Кроме того он имеет несколько режимов работы:

UnInteractive — Триггер неактивен а переключение его состояний вы должны реализовать сами при помощи Blueprint функции ChangeState.

Interactive — Триггер активен, когда вы подходите к нему достаточно нажать клавишу e и он перейдет в Активное состояние.

AdvanceInteractive — Когда вы подходите к нему и нажимаете e то открывается окно взаимодействия с сообщениями которые определены в редакторе сообщений.

Также триггер как и персонаж может получать сообщения от главного графа.

4)DialogTrigger — Объект введеный мной для взаимодействия диалогов и сообщений с главным графом. Тоже имею два состояния (Активен, неактивен). Переключаются в редакторе диалогов персонажа и редакторе сообщений триггера.

5)InventoryItem — Сюжетный предмет инвентаря. Может иметь несколько состояний котрые задаются в свойствах. Эти состояния приблвляются к уже существующим (неактивен, на уровне и в инвентаре). Состояния меняются вопервых путем подбора предмета и кроме того их можно задавать в редакторе диалогов персонажа и редакторе сообщений триггера как и состояния DialogTrigger. Предмет инвентаря тоже может получать сообщения.

6)Others — Предметы которые не относятся к выше перечисленным но участвуют в развитии сюжета. Эти предметы не имеют состояний но могут принимать сообщения и в зависимости от них изменятся.

Хочу заметить что благодаря тому что квестовые объекты и объекты которые находятся на карте это разные объекты. То можно работать параллельно. Например вы создаете сюжет а ваш друг создает карту. И когда все буде готово можно их объединить.

После создания сюжетных предметов можно уже начинать создавать квесты. Тут нужно уточнить что все ноды делятся на два вида, это независимые ноды которые можно размещать когда захочешь, и зависимые ноды которые появятся только после создания объектов которые от них зависят. Кроме того плагин поддерживает технологию drag and drop поэтому если вы перетащите объект на поле графа то вам предложат создать все ноды которые зависят от данного объекта.

Все ноды имеют два типа связей это вертикальные связи и горизонтальные. Вертикальное дерево это основа вашего квеста именно оно определяет его структура и порядок выполнения. Горизонтальные ноды это модификаторы конкретной фазы квеста (нода фазы имеет как вертикальные так и горизотальные связи). Нои могут добавить какие-то объекты на радар или отправить сообщение объекту, все это произойдет когда активируется конкретная фаза квеста.

Итак давайте опробуем что-то создать. Сначала создаем квест. После этого можно разместить стартовую ноду квеста. К этой ноде можно прикреплять ноды трех видов:

1)AddQuestPhase — Нода добавляет в квест новую фазу когда активируется.
2)GetObjectState — Эта нода активируется когда конкретный сюжетный объект переходит в конкретную стадию, указанную в свойствах ноды. Если нода активировалась то она активирует ноды расположенные за ней. Представте себе трубопровод который берет начало от стартовой ноды, тогда нода GetObjectState будет вентилем который до определенного времени закрыт и не пропускает воду дальше но если он откроется то вода дальше пойдет.
3) GameOver — Из названия понятно что как только эта нода активируется происходит завершение игры.

После того как вы создали «вертикальное» дерево. К нему можно добавлять горизонтальные ноды вот их описание:

1)Activate/deactivate dialog(message) — Активирует или де активирует ветвь диалога или сообщения.
2)Active/deactive object — Активирует или де активирует объект. Имеется ввиду что при де активации, объект просто пропадет из игры. Например вам уже не нужен какой-то объект от него можно избавится, или наоборот объект понадобится на каком-то этапе игры и что-бы персонаж не нашел его раньше времени его тоже можно де активировать.
3) Cancel quest — Отменить квест, например если квесты противоречат друг другу и персонаж начал выполнять один из них то другой можно отменить.
4) Send Message — Послать сообщение сюжетному предмету чтобы он както изменился. Само изменение определяется в Blueprinte у всех внешних объектов имеется event GetMessegeFromStoryGraph который срабатывает при активации этой ноды.
5)Add Screen Message — Вывести на экран сообщение которое увидит игрок.
6)Add to radar — Добавить объект на радар. Объект будет выводится на радаре до тех пора фаза квеста к которой прикреплена нода будет активна.
7)Print quest phase on screen — Вывести содержимое конкретной фазы квеста на экран. Может быть полезно ну например в начале игры показат персонажу что вы от него хотите.
8) Send message to level blueprint — Тоже самое что Send Message но посылает сообщение в blueprin уровня. Чтобы эта нода заработала нужно сменить базовый класс для level blueprint с ALevelScriptActor на ALevelScriptActor_StoryGraph.

Как поменять базовый класс блюпринта:

image

Кстати чтобы новые уровни создавались с нужным level blueprint можно изменить настройки проекта вот: ProgectSettings->GeneralSettings->LevelScriptActorClass.
9) Print string — Эта нода стоит особняком, поскольку на имеет как вертикальные связи так и горизонтальные. Она выводит отладочное сообщение чтобы вы могли протестировать ваш сценарий.

Кроме главного редактора в котором создаются квесты, имеются ещё и вспомогательные. Это редактор диалогов для персонажа и редактор сообщений для триггера. Вот описание нод используемых в данных редакторах. Поскольку они сходны я приведу описание для них обоих.

1)New dialog(message) brunch — Создать новую ветвь диалога или новое сообщение. Каждый диалог должен начинаться с этой ноды. Она может быть активна и тогда эта ветвь будет отображаться сразу или неактивна и тогда её нужно будет с начало активировать.
2)Dialog(message) node — Ноды из которых состоит ветвь диалога имеет один вход и несколько выходов (в зависимости от количества ответов).
3)Dialog(message) end — Если после того как ветвь диалога прошла до конца она больше не нужна. Постав те в конце эту ноду, ветвь де активируется и больше не появится.
4)Dialog(message) exit — Осуществляет выход из окна диалога.
5)Set dialog trigger — Устанавливает значение триггера диалога.
6)Activate trigger — Нода присутствует только в редакторе сообщений триггера. Она как можно догадаться активирует сам триггер.

После того как все будет сделано, вы запустите игру и ничего не произойдет, что бы сюжет начал работать нужно перетащить объект StoryGraph на уровень или воспользоваться соответствующим пунктом контекстного меню.

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

Собственно пока все вот исходники:
github.com/Deema35/StoryGraph

А если вы хотите просто поиграть в демку (её сюжет можно видеть на первой картинке), то скачать её можно здесь:
cloud.mail.ru/public/J6Y2/gPCyFRBPG

Управление в игре стандартное:
i — инвентарь
j -журнал
f — переключение вида

Автор: deema35

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js