Как сделать маленькую игру - Диалоги
Хотел рассказать, как реализовал свою диалоговую систему. Это не руководство к действию (у меня абсолютно нет опыта в подобных вещах), а скорее повод для разговоров на эту тему.
Для Godot есть несколько готовых решений для диалогов, есть даже на нодах… Но я не стал их рассматривать, не хотелось разбираться в чужих костылях, нужно было сделать самостоятельно, чтобы вообще понять, как это работает.
Как всё устроенно?
Как только персонаж соприкасается с областью Area2D (триггер), диалог либо стартует автоматически, либо появляется индикатор и игрок может начать диалог. Из этого триггера в диалоговую систему передаётся массив. Диалоговый триггер может быть отключен или включен с помощью переменных в самом диалоге. Всё достаточно просто.
Как хранится диалог?
Вариантов как хранить диалог испробовал несколько, и что-то типа ScriptableObject, и словари, но остановился на простом массиве, вроде так все и делают… Каждая строка в массиве — это одно действие в диалоге, их несколько видов:
- Текст — просто печатает заданный текст
- Аватар — показывает аватар
- Случайная строка — показывает одну случайную фразу от 2 до 10
- Переменная — изменяет переменную в базе данных, можно прибавить, убавить или задач целое значение
- Вопрос — показываем вопрос и 2−3 варианта ответов и задаём якори, к которым ведут ответы
- Якорь — при ответе на вопрос, находится нужный якорь и диалог продолжается далее
- Идти к Якорю — просто перекидываем диалог к определённому якорю
- Выход — принудительное завершение диалога
Как это работает?
Диалоговая система берет из триггера массив и каждую строку обрабатывает в соответствии с её типом… всё…
Зачем свой редактор диалогов?
По идее можно обойтись без редактора и заполнять массивы ручками, в инспекторе. Но это жутко не удобно… Так же как редактировать диалоги в каком нибудь XML или JSON… В Unity можно модифицировать инспектор под свои нужды, в Godot этого сделать нельзя (по крайне мере я такого не видел). Но можно сделать своё «расширение», и делается оно как игра,
Здесь можно наглядно увидеть как различается редактирование в инспекторе и в своём редакторе:
Слева-снизу редактор, справа инспектор
Процесс создания диалога в игре.
Просто покажу как это всё работает в созданной локации:
- Нужно создать корневой нод, чтобы дерево сцены было упорядоченно
- Берем из «ассетов» заранее заготовленный «префаб» Area2D с прикрепленным скриптом
- Делаем дочерним шейп — триггера (не заготовил заранее, потому что форма зоны диалога может быть разная)
- При выделении триггера, открывается редактор диалога, заполняем и можно запускать игру, всё работает.
Что далее?
Для этой игры, скорее всего ничего менять в диалоговой системе не буду, только фиксы, которые конечно будут появляться в процессе. Ну, а после, подумаю как отделить это от игры, и сделать самостоятельной системой, которую смогу использовать в дальнейшем. Но это будет происходить постепенно…
Вот и всё… Думал будет больше слов…
В общем можете писать, что всё сделано не правильно и как нужно делать правильно!
- 19 августа 2020, 17:37
- 011
Не пора создать категорию "как сделать маленькую игру"? Постов уже вон сколько накопилось.
оно уже есть
Только вот не отображается что пост входит в какой-то цикл статей. Или я не вижу.
Или это "Как сделать маленькую игру" под шапкой сайта?
похоже только наверху, да.
Если ещё как-то можно показать, я не знаю об этом.
Оно автоматически понимает? То есть это реально как кастомный инспектор в Юнити, но только ... не он?
Интересно как оно там работает, подробности там (можно в личку (и\или ТГ), а можно рассказать всем).
https://docs.godotengine.org/ru/stable/classes/class_area2d.html
Да, автоматически открывается панель снизу, когда выбираешь ноду в иерархии. сейчас это у меня криво немного сделано, он открывается при выборе ноды типа Area2D и чтоб имя этой ноды начиналось с сочетания букв AD. Это нужно немного исправить, но потом.
В Годо модифицировать инспектор можно (export var) , но он имеет четкую структуру: имя - значение. Значение может быть файлом, тип Color, тип float и тому подобное, есть вложенный тип (это когда щелкнув на него откроется группа имен и их значений, по типу того как шейдер напяливать на ноду). Очень интересно об этом узнать, заглянув в плагин trenchbroom.
Это понятно, но не очень удобно, если параметров много.
Все сделано неправильно :) Шутка. Но на самом деле вопрос: зачем все так усложнять ? Я понимаю - хочется научиться программировать. Однако на мой взгляд по незнанию ты занимаешься совершенно бесполезной ерундой. Нет правда. Ты сначала придумай сами диалоги. Может тебе не нужна вообще будет система диалогов :))) У настоящих программистов - если ты им хочешь и правда стать - есть простой секрет - не надо все усложнять. Чем больше усложнений - тем хуже себе делаешь. Т. к. игра будет разрастаться и усложняться - и ты сам про это уже кстати писал. :))) Если в учебных целях - то конечно все супер. Но если для игры - это все ненужный хлам который будет постепенно захламлять твой проект. Старайся все делать как можно проще. Помни - пройдет год и ты будешь кричать караул если будешь и дальше делать такие вещи - на каждый чих порождать груду ненужного кода. Уж для чего, а для системы диалогов, которой к тому же возможно у тебя не будет - делать такое не надо. Да - json, xml или просто текстовый файл заполнять проще, чем плодить такую систему, в которой постепенно сам запутаешься. И не игру будешь делать, а воевать со своими объектами.
Хочешь сделать игру - делай игру, а не всякую чепуху. Иначе в итоге у тебя и получится чепуха. У тебя есть движок, что тебе еще нужно ? :)))
Настоящий геймдизайнер (коим ты наверное хочешь стать делая игру), занимается именно деланием игры, а не программированием. Если ты занимаешься программированием - ты уже автоматически не делаешь игру, а программируешь. Почему так получается ?
Подумай сам - сделал ты систему диалогов, потратил уйму времени и что дальше ? Игра то не продвинулась. Играть пока не во что и даже писать особо не о чем.
Парадокс. И вот так собственно и будет протекать все создание игры.
Нет. Правильный путь - написать четкий план и ему следовать. Понятно, что план будет дополняться/меняться/выбрасываться в корзину и писаться как новый. Но план должен быть.
Если же надеяться на удачу то, ты вскоре забудешь вообще зачем делал эту игру. Тебе её станет просто неинтересно делать. И в итоге ты забросишь.
Прогресса пока к сожалению никакого. Слишком быстро ты накатал новый пост. А подвижек 0. Увы.
Старайся делать так, чтобы нам (как зрителям) было интересно. Тогда и проект твой сдвинется с мертвой точки. А вообще тебе самому должно быть интересно.
Я конечно не претендую на истину в последней инстанции, и могу в чем-то (или во всем) ошибаться. Но пока я вижу большой потенциал и неспособность его развить. Ты уже сколько времени делаешь игру ?
В то что сделано уже можно играть ? А когда будет можно ?
Играбельный прототип уже должен был быть сделан в 1 день начала разработки. Если же его до сих пор нет - ну это знаешь ... пока не игра даже. А ТЗ какое-то. Есть набор описаний, картинок, даже видео ... И на этом все... А где же игра ? Пока что у тебя в голове.
И твоя задача сделать так, чтобы она так и не осталась только в твоей голове.
У дачи ! (Только не стой рядом с дачей, а делай игру :)))) )
Не со всем согласен.
Нельзя заранее предсказать со 100% точностью что тебе понадобится.
План - это хорошо, но нельзя абсолютно все зарание распланировать.
Главное чтобы созданный инструмент решал поставленную задачу. Если ему нужно много диалогов, то нужен инструмент который позволит тратить на вбивание в игру каждого из диалогов как можно меньше времени.
Даже если это потом будет ненужный велосипед, то теперь он умеет их делать. А по поводу велосипедов - ты сам делаешь игры на самописном движке вместо того чтобы взять готовый.
Я вот делал в Love2D динамическое освещение, но ни в какой игре его не применил. Просто хотел разобраться как это делается. Разбирался как писать шейдеры, и написал я их всего-то пару штук.
Где я написал что можно ? Но какой-то ориентир должен быть. Если его нет - то ну не знаю, вы уверены что игру делаете ? Самый простой инструмент - это самый простой инструмент. Если это чуть сложнее чем 1 клика мышью или нажатием 1 клавиши - это уже не простой. Красивые шейдеры не делают игру интересной. Это только графика (см. свод моих правил - https://gamin.me/posts/21171)
А кто сказал что его нет?
Никто. Но у тебя явно его нет. Это сразу видно. Если обидел, извини. Но цели у тебя нет. Цель скорее сделать некое нечто. А что будет в итоге ты и сам не знаешь ...
да, я пишу код и рисую последовательно, будь что будет =))) это было бы очень странно...
цель сделать интересную (хотя-бы немного) игру...
релиз надеюсь =)
Релиз чего ? Извини, если докапываюсь, просто задай этот вопрос сам себе. Больше не буду повторяться.
релиз игры, иначе зачем бы я писал дневник разработки?
ИГРЫ. Это похвально. А о чем будет игра ?
О космонавте конечно, видно же. Аварийная посадка, протагонист хочет выбраться с неизвестной ему планеты. Или Вам сразу весь сюжет расписать?
В данном посте ничего не видно. Что касается остальных - тоже не совсем понятно. Но речь даже не об этом. Какова основная ключевая идея игры ? Минимализм ? Использование 3х (а может в будущем и больше) цветов ? И это всё ? Понятно что мне и остальным это сообщено не будет пока не будет сделана игра. Но на первый взгляд видно что сюжет весьма банален (если он вообще есть), идей по его развитию пока никаких, а система диалогов особо не прибавит вообще ничего. И сейчас понять, что из этого получится какой-то шедевр - вряд ли возможно. Однако же есть люди, думающие иначе. Никаких особенных игровых идей пока что нет. Кроме указанного. Когда я спрашивал о чем, то спрашивал именно про это. Неужели я буду спрашивать очевидные вещи ? :))))
Просто публикую процесс разработки, пока нет цели рассказать всё, потому-что пока всё на уровне идей, как будет реализовано, частично расскажу, частично умышленно умолчу.
Не совсем понимаю о чем речь.
Это графический стиль, а не основа игры...
Цитаты из первого поста:
"Идея была максимально проста. Герой терпит крушение на неизвестной планете, и должен собрать детали для своего корабля. Т. е. ходим по окружению, собираем шестеренки, возвращаемся к кораблю, улетаем. КОНЕЦ!"
"Так пришлось написать какую-то небольшую историю. Маленькое приключение с поиском выхода из сложной ситуации, встречи с местными жителями, немного истории этого места…"
Не планирую делать эпик, уровня звездных войн или властелина колец...
Не знаю как у Вас, а у меня есть идеи, пытаюсь их как то придержать, чтоб получилось реализовать.
Прибавляет мне уверенности в силах, и скорость к созданию уровней.
Не стремлюсь сделать ШЕДЕВР, просто делаю то что мне нравится.
Да и не стремлюсь делать что-то уникальное и новое, просто делаю игру.
Не знаю, иногда делают. Откуда берутся только эти любители сферических игр в вакууме)
Есть такое. Но красивые шейдеры не делают игру автоматически игрой. Представьте игру без них. А шейдеры без игры ?
Представил
Представил
И что?
По моему, это называется "упрощать"
Не хочу стать программистом, хочу реализовывать свои задумки. А как это называется, "настоящий программист" или "говнокодер", мне без разницы
И к этому званию не стремлюсь.
Для вас никакого, а для меня серьёзный этап пройден.
Это дневник разработки, больше для себя, и может для парочке человек, кому интересно наблюдать. Это не основной контент. И цели "развлекать" нет.
Вроде с февраля этого года.
В то что сделано, конечно можно.
Посмотрел бы я на играбельный прототип за 1 день... что же в нем должно быть?
И не говорил что это игра.
Конечно, это же дневник разработки... Делаю в свободное от работы и семьи время.
Если тебя пугает звание говнокодер. Тебе никогда не сделать нормальную (а тем более успешную игру). Просто констатирую факт. Если только не собрать из готовых компонент в качестве геймдизайнера.
Похоже что да. Это ТЗ :) Но тут на гамин вообще-то про игры обычно пишут. Значит есть какое-то ощущение, что все-таки будет игра. Или нет ?
Где я написал что меня пугает звание "говнокодера"?
Что???
Не только, но и разработке, иногда.
Я не говорю, что не надо писать, ты меня не путай :))) Я говорю что по факту у тебя нет игры. Есть Техническое задание. (ТЗ)
Так я не говорил что игра уже готова...
И я не говорил. С чего бы это ? Но мой вариант заметь, был готов за 1 ! день. Извини, если сыплю соль на рану. Я не пытаюсь докапываться если что. Ты читал "Чапаев и Пустота ?". Вот почитай попробуй. Может поймешь что-то. А может и нет :))) Знаешь, не стоит воспринимать все только на свой счет. Просто по факту я вижу, что твоя "игра" никогда не будет "игрой". Если вообще будет. Еще раз прошу не обижаться. Может это будет что-то совершенно новое, я уверен. А еще я уверен, и ты это сам прекрасно знаешь, что нельзя ограничиваться только 1 попыткой в чем-либо. Так не бывает, что захотел и сделал. Не всегда это получается с 1 попытки. Это тоже надо принять как данность. С другой стороны конечно, да уникальность момента. И это все понятно. Пришел тут мегаинформатик и начал критиковать :)))) А если бы не критиковал ? Стал бы ты дальше делать игру ? Ну ладно. Извини если что. Это все просто мысли. Не стоит все воспринимать слишком близко к сердцу и прям в штыки. Но если все ок, то и ладно.
Вы считаете что у меня персонаж не ходит по локации, и я показываю просто картинки из графического редактора? За день у меня был персона, он бегал, с анимацией. Но это не прототип игры, это просто управление персонажем...
Что???
Не читал и не собираюсь.
А где факты?
А кто сказал что это первая попытка? =)))
Конечно, раньше делал... и после ухода мегаинформатика, буду делать...
Одобрямс!
Прочитал наконец статью.
Получился инструмент для левел-дизайнера.
А как быть если на какой-то строчке диалога нужно изменить комнату/сцену? Или проверить условие?
Получился некий объект, некое нечто, применение чему пока неизвестно. Не хочу обидеть, но цели для этого объекта тоже пока нет. Как нет и диалогов, поэтому сделано ради того, чтобы было :)))
Вообще-то уже использую, очень удобно и быстро. Можно заниматься наполнением игры.
Именно так, чтоб спокойно делать уровни.
В данной игре переход через диалоги не предусмотрен, но теоретически дополнить можно без проблем. Пока не нужно, далее посмотрим.
Проверка условия тоже в ходе диалога не предусмотрена. Сложных диалогов не планировал, даже не думал что буду делать варианты ответов... но увлёкся. Можно отключать сами триггеры с помощью переменных.
Налажена система диалога с мегаинформатиком. :)
А мог бы игру делать!
Делаю!!!
Выглядит вполне удобно для быстрого тестирования и для джемовских игр, где можно юзать заготовки. А перевод на несколько языков удобно будет туда вставлять?
Перевод умеет сам Godot. просто вместо текста нужно вставить ключи из соответствующей таблицы.
Какой удобный инструментарий в годоте о_О
Хотел бы такие таблицы создавать в юнити или GMS,
>>В Unity можно модифицировать инспектор под свои нужды
с этим у меня проблемы, игру легче создать, чем понять этот инспектор
переходи на Godot =)
не углублялся, это сложно да, пользовался только хедерами, отступами, сериализацией... давно это было...
Советчиков у него слишком много. Этому самураю суждено пройти тернистый путь, чтобы сделать свой выбор
Тут ещё зависит от самих игр. Из того, что понравилось GMS, не следует, что уже начатую 3D-игру надо срочно переводить в пиксель-арт и GMS.
тоже самое)