Как сделать маленькую игру - Диалоги

Хотел рассказать, как реализовал свою диалоговую систему. Это не руководство к действию (у меня абсолютно нет опыта в подобных вещах), а скорее повод для разговоров на эту тему.

Для Godot есть несколько готовых решений для диалогов, есть даже на нодах… Но я не стал их рассматривать, не хотелось разбираться в чужих костылях, нужно было сделать самостоятельно, чтобы вообще понять, как это работает.

Как всё устроенно?

Как только персонаж соприкасается с областью Area2D (триггер), диалог либо стартует автоматически, либо появляется индикатор и игрок может начать диалог. Из этого триггера в диалоговую систему передаётся массив. Диалоговый триггер может быть отключен или включен с помощью переменных в самом диалоге. Всё достаточно просто.

Как хранится диалог?

Вариантов как хранить диалог испробовал несколько, и что-то типа ScriptableObject, и словари, но остановился на простом массиве, вроде так все и делают… Каждая строка в массиве — это одно действие в диалоге, их несколько видов:

  • Текст — просто печатает заданный текст
  • Аватар — показывает аватар
  • Случайная строка — показывает одну случайную фразу от 2 до 10
  • Переменная — изменяет переменную в базе данных, можно прибавить, убавить или задач целое значение
  • Вопрос — показываем вопрос и 2−3 варианта ответов и задаём якори, к которым ведут ответы
  • Якорь — при ответе на вопрос, находится нужный якорь и диалог продолжается далее
  • Идти к Якорю — просто перекидываем диалог к определённому якорю
  • Выход — принудительное завершение диалога

Как это работает?

Диалоговая система берет из триггера массив и каждую строку обрабатывает в соответствии с её типом… всё…

Зачем свой редактор диалогов?

По идее можно обойтись без редактора и заполнять массивы ручками, в инспекторе. Но это жутко не удобно… Так же как редактировать диалоги в каком нибудь XML или JSON… В Unity можно модифицировать инспектор под свои нужды, в Godot этого сделать нельзя (по крайне мере я такого не видел). Но можно сделать своё «расширение», и делается оно как игра, т. е. это просто сцена из игры…

mov84Ek

Расширение, это простая сцена с интерфейсом, как в игре

Здесь можно наглядно увидеть как различается редактирование в инспекторе и в своём редакторе:

x5BczNt

Слева-снизу редактор, справа инспектор

Процесс создания диалога в игре.

Просто покажу как это всё работает в созданной локации:

  1. Нужно создать корневой нод, чтобы дерево сцены было упорядоченно
  2. Берем из «ассетов» заранее заготовленный «префаб» Area2D с прикрепленным скриптом
  3. Делаем дочерним шейп — триггера (не заготовил заранее, потому что форма зоны диалога может быть разная)
  4. При выделении триггера, открывается редактор диалога, заполняем и можно запускать игру, всё работает.

Что далее?

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

Вот и всё… Думал будет больше слов…
В общем можете писать, что всё сделано не правильно и как нужно делать правильно!