Господа разработчики
Господа разработчики, поделитесь, как вы реализуете систему диалогов (вопрос тем, кто этим занимается)? Как скармливаете определённый диалог в ту или иную ситуацию? Я что-то сделал, но очень недоволен результатом.
Как это работает у меня.
Есть сцена, которая выводит, проигрывает диалоги и завершает показ. Я ей скармливаю массив с текстом. Далее я хочу, чтобы у каждого npc был свой набор диалогов — создал csv файл и несколько строк диалогов, каждому npc прописал массив, с индексами строк соответствующего cvs файла. И завёл некий счётчик, который будет выбирать индекс диалогов, а тот в свою очередь будет брать нужную строку в csv файле.
З. Ы. Удобно то, что в одной строке csv файла можно выстроить диалог, разделив предложения запятыми тем самым получая длинные диалоги.
И мне кажется, что можно проще.
З.
- 26 января 2020, 22:07
В идеале должны быть статьи или книжки умных дядь по геймдеву, которые уже знают как это реализуется.
Я вот хотел бы именно это увидеть. Неужели никто не делится опытом своих велосипедов? Все уже придумали до нас - надо просто рассказать.
Я в Tri0 делал так.
В одном файле - весь текст на одном языке (здесь файл приведен не полностью).
Здесь в [ ] - название персонажа, name - его отображаемое имя, остальные значения - названия фраз.
пример диалога в коде игры
первый стобик - название фразы из файла locale_rus, вторая - название персонажа, который ее говорит.
В коде:
talk.start_conv(new_conv, starter_name) - начинает новый диалог, переводит игру в состояние ожидания нажатия пробела
talk.next_phrase() - переход к следующей фразе в диагоне, вызывается после нажатия пробела
talk.finish_conv() - возвращает игру в предыдущее состояние
talk.draw_phrase() - рисует текст диалога и рисует иконку персонажа, к-й говорит
Я у наших разрабов не видел подробного разбора, за бугром есть пара статей, но технический английский надо прям знать, чтобы вникнуть. Я же надеюсь, что кто-то поделиться реализацией своих костылей, а я сравнив со своим, смог бы его улучшить...
У меня к сожалению не простой диалог в юнити.
Сделал вначале свой мини-язык, который ставится на паузу, если появляется диалог.
В сам мини-скрипт пишу что-то типа:
talk - это оператор
hello1 и прочие - это ячейка в массиве текста с диалогом
face1 - это объект лица при выводе диалога
Скрипт читается и запоминает на какой строке он остановился, если ставится на паузу при диалоге,
и потом после диалога начинаем сразу со следующей линии читать.
Если честно ХЗ как делать, если буду переходить на Game Maker или Godot, надеюсь
не надо будет там тоже свой дополнительный язык писать, чтоб делать такой скриптер, который читается пока не выводится на экран диалог, а после диалога продолжается с прошлой линии.
https://www.dropbox.com/s/fh5h82fatwswzt9/Dialogue4-1.1.zip?dl=0
Написал такую систему в 2011. Там внутри всё понятно, а если нажать F1 в самом EXE, то ещё и справка по формату скрипта диалогов будет. Правда, на английском, так как планировалось это задействовать в проекте с иностранцами, а то и в маркетплейс продать, но как-то влом было заниматься что тем, что другим, что вообще игру делать. Так и лежит 9 лет в столе, ждёт своего часа, когда я портирую с ГМ8.1 на Студию 1 и потом на Студию 2.
Ксит, а там просто exe-шник, или есть скрипты чтоб глянуть как вообще это всё в ГМ устроено, хотя хз смогу ли я это глянуть на своей демке 8.1, но просто спросил) мне на ГМ не хватает примеров исходников, чтоб понять от чего отталкиваться, чтоб изучить GM. Я для изучения Tic80 накачал кучу исходников, и когда видишь как это работает, то легче идёт обучение, для меня пару исходников информативнее и продуктивнее, чем 100 видео уроков, потому-что обучение происходит в скоростном темпе) Ну это я так просто спросил, может ты просто знаешь места, где можно сорсы для 8.1 лайт версии посмотреть, если этот исходник секретный.
По ссылке exe, да. Кодилось именно на 8.1, и скорее всего на лайт версии тоже запустится. Но я бы не сказал что мой исходник это оптимальный способ всё на свете кодить, это просто одна из возможных реализаций. Исходник не секретный, видимо даже лучше будет если я его выложу в открытый доступ. Да и в целом, если сделать сразу Public Domain, может ли быть от этого какой-то негативный эффект в будущем, кто знает?
По-моему если человек додумается хотя бы достойно применить уже готовый компонент к своей игре, это уже само по себе большое дело. Ладно там написать своё. И как-то по барабану, если кто-то потом выдаст мой код диалогов за свой, потому что диалоговая система это не игра, на ней даже визуальную новеллу нельзя сделать, разве что состоящую из вопросов с ответами "Да" и "Нет".
Но сначала послушаем что скажут люди.
Ну если что было бы полезно глянуть, я ещё ни одного готового/полуготового проекта не видел на GM из-за этого я не совсем понимаю с чего начать, к чему бы подступиться. Обычно поначалу, какие бы я не брал языки раньше, всегда шли с примерами и я их просматривал и делал выводы как тут всё устроено, а в лайт демо версии GM8.1 тут либо нету примеров после установки, либо я не там их смотрю) Но на офф сайт я даже не пытаюсь залезать, там скорее всего примеры под новые GM, я бы установил новую демку, но у ней 30 дней ограничение, не очень удобно изучать материал. Я ещё для себя не решил буду ли в будущем юзать GM, удобно ли будет для меня, или нет, ибо хз как подступиться, ну кроме как в документации 2 стартовых урока есть, может как нибудь их попробую выполнить, но там походу нет скриптов, а какой-то визуальный язык иконок, или я опять не там смотрю, лол)
https://www.dropbox.com/s/f086jyr4wqwt65f/LD48%2323%20Equanimity%20%28GMK%20source%20code%29.zip?dl=0
Ну например.
Ксит, Спасибо) надеюсь откроется в демке)
Да я по-моему в демке его и делал. У меня лицензия на 8.1, а этот исходник от 8.0. Откроется в 8.1 точно.
Спасибо, открыл! Посмотрел. Получается там большая часть скриптов пишется в визуальных иконках?!
Это напоминает Construct 2 и немного Stencyl, в принципе начинаю понимать как оно тут всё устроено,
не сложнее обычного конструктора. Думал вначале что там средняя сложность между Unity и Construct 2,
оказалось что оно даже легче.
Я примерно так же делаю. Но потом хочу проапгрейдить: добавить закладок, чтобы запоминать, на чём остановилась определённая тема. Чтобы можно было перебить, а позже ещё раз переспросить, но не заново и не по индексу, а с закладки. Плюс индекс в моём случае - плохая идея, так если его запомнить в сейв, а потом поменять диалог, то индекс может сбиться при загрузке.
Метки для этого надо делать строчные, как в моей системе.
Никогда пока не приходилось делать диалоговой системы, но я бы сделал "нодовую" систему c привязкой к тексту и другим нодам по айдишкам (по факту та же система как в упомянтом nodegrath, но ноды можно вполне хранить в xml/json формате, таким образом попросту записав их в файл).
Грубо говоря, имеешь два типа нод - блоки диалогов и диалоговых опций (ответы/вопросы). У каждой ноды есть ее собственная айдишка, а также айдишка текста, который ей соответствует. Сами ноды ссылаются на другие ноды посредством указания айдишек, например, если диалог состоит с нескольких блоков, то нода первого блока ссылается на айдишку следующего блока, или блок диалога указывает айдишки нод вопросов/ответов, которые должны ему соответствовать (а уже нода выбранной диалоговой опции ссылается на айдишку соответственного блока диалога).
В игровой логике это выглядело бы так - у стартера диалога есть айдишка стартового диалога. Игра читает айдишку, читает с xml файла инфу о соответственной ноде, находит текст, соответствующий ноде, и выводит его на экран. При нажатии кнопки "далее" читает, на что ссылается нода, и подгружает ноды необходимые для продолжения. Если дальше выбор, то читает ноды диалоговых опций, отображает их как кликабельные объекты, и по щелчку подгружает ноду с айдишкой, на которую ссылается ответ. Текст при этом всём может храниться в отдельном файле как словарь "айдишка-текст", что дает довольно простую систему локализации.
Мне эта система нравится, потому что нет прямой привязки текста к логике диалогов, один и тот же текст можно использовать в нескольких разных местах (например, генерик фразы), несколько нод могут ссылаться на одну и ту же ноду (свод веток диалогового дерева), или даже на более раннюю ноду в диалоге (то есть, вполне можно сделать кнопку "назад", или "давай поговорим о чем-то еще"). Этим подходом можно делать диалоги как разветвленными, так и длинными линейными. Еще в нодах можно хранить больше инфы (конечно, при этом надо будет добавить в игру логику, которая будет эту инфу интерпретировать), например, параметры, отвечающие за говорящего персонажа (например, имя и портрет). Или указывать какие изменения игра должна выполнить при выполнении ноды ответа (например, изменение репутации с фракцией), а то и вызывать какой-то событие.