Как сделать маленькую игру - Диалоги
Хотел рассказать, как реализовал свою диалоговую систему. Это не руководство к действию (у меня абсолютно нет опыта в подобных вещах), а скорее повод для разговоров на эту тему.
Для Godot есть несколько готовых решений для диалогов, есть даже на нодах… Но я не стал их рассматривать, не хотелось разбираться в чужих костылях, нужно было сделать самостоятельно, чтобы вообще понять, как это работает.
Как всё устроенно?
Как только персонаж соприкасается с областью Area2D (триггер), диалог либо стартует автоматически, либо появляется индикатор и игрок может начать диалог. Из этого триггера в диалоговую систему передаётся массив. Диалоговый триггер может быть отключен или включен с помощью переменных в самом диалоге. Всё достаточно просто.
Как хранится диалог?
Вариантов как хранить диалог испробовал несколько, и что-то типа ScriptableObject, и словари, но остановился на простом массиве, вроде так все и делают… Каждая строка в массиве — это одно действие в диалоге, их несколько видов:
- Текст — просто печатает заданный текст
- Аватар — показывает аватар
- Случайная строка — показывает одну случайную фразу от 2 до 10
- Переменная — изменяет переменную в базе данных, можно прибавить, убавить или задач целое значение
- Вопрос — показываем вопрос и 2−3 варианта ответов и задаём якори, к которым ведут ответы
- Якорь — при ответе на вопрос, находится нужный якорь и диалог продолжается далее
- Идти к Якорю — просто перекидываем диалог к определённому якорю
- Выход — принудительное завершение диалога
Как это работает?
Диалоговая система берет из триггера массив и каждую строку обрабатывает в соответствии с её типом… всё…
Зачем свой редактор диалогов?
По идее можно обойтись без редактора и заполнять массивы ручками, в инспекторе. Но это жутко не удобно… Так же как редактировать диалоги в каком нибудь XML или JSON… В Unity можно модифицировать инспектор под свои нужды, в Godot этого сделать нельзя (по крайне мере я такого не видел). Но можно сделать своё «расширение», и делается оно как игра,
Здесь можно наглядно увидеть как различается редактирование в инспекторе и в своём редакторе:
Слева-снизу редактор, справа инспектор
Процесс создания диалога в игре.
Просто покажу как это всё работает в созданной локации:
- Нужно создать корневой нод, чтобы дерево сцены было упорядоченно
- Берем из «ассетов» заранее заготовленный «префаб» Area2D с прикрепленным скриптом
- Делаем дочерним шейп — триггера (не заготовил заранее, потому что форма зоны диалога может быть разная)
- При выделении триггера, открывается редактор диалога, заполняем и можно запускать игру, всё работает.
Что далее?
Для этой игры, скорее всего ничего менять в диалоговой системе не буду, только фиксы, которые конечно будут появляться в процессе. Ну, а после, подумаю как отделить это от игры, и сделать самостоятельной системой, которую смогу использовать в дальнейшем. Но это будет происходить постепенно…
Вот и всё… Думал будет больше слов…
В общем можете писать, что всё сделано не правильно и как нужно делать правильно!
- 19 августа 2020, 17:37
- 011
45 комментариев