20

Path Of Despair, quest system

Всем привет.

Предыдущий пост набрал довольно-таки много отзывов, да и мне нужна конструктивная критика, поэтому сейчас расскажу вам, как я реализовал систему квестов в Path Of Despair.

Основную задачу, которую я поставил перед собой - создать как можно меньше скриптов, и как можно универсальнее. Мне нужно было, чтобы для создания нового квеста мне нужно было просто создать объект в квест листе, заполнить описание , название, награды и тд в инспекторе и все. Так-же главной задачей было полностью отказаться от метода Update.

Первым шагом я создал окно с квест-буком. С левой стороны ScrollView с Vertical Layout Group в который помещаются префабы кнопок. С правой стороны все описание квеста(название, информация о квесте, отслеживание прогресса, награда , название награды , количество получаемого опыта и кнопка "complete").

Родительским объектом этого окна я сделал пустышку, в которую поместил Квест лист. Квест-бук - дочерний объект, для того, чтобы при его закрытии, была возможность ссылаться на квест лист.

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

Начнем со скрипта Quests. Соответственно, данный скрипт висит на объекте в Квест листе.

В ссылках указываем пути к "правой стороне" квест бука, а так-же к объектам отвечающим за обновление квест бука( чуть дальше покажу ), появлением сообщения на экране(MessageCanvas) , панели с наградой (RewardTooltip) и ссылкой на инвентарь(для проверки на наличие нужного предмета по квесту).

В этом скрипте вся необходимая информация по квесту. Название, информация, награды, отслеживание прогресса, выбор типа квеста ( пока-что это убийство мобов, или поиск предмета), а так-же название сохранения.

На старте проверяем активен квест или нет, а так-же ищем инвентарь.

Дальше идет 2 проверки. Первая проверяет есть ли в инвентаре необходимый предмет и возвращает true или false. Вторая проверяет больше или равно количество убитых монстров по отношению к нужному количеству по квесту.

Тут только 1 метод, но, пожалуй самый главный. Данный метод срабатывает при нажатии на кнопку в "левом столбце" квест бука. Т.е. своеобразный выбор квеста из перечня.

При выборе квеста(нажатии на кнопку) -  подставляется вся информация о квесте в необходимые части "правой стороны" квест бука.

Тут, самый приятный метод =) Получение награды. Метод срабатывает при нажатии кнопки "Complete".

Проверка есть ли место в инвентаре, если в награду дают предмет. Если место есть и предмет помещен в инвентарь - обнуляем все значения по умолчанию , закрываем и выключаем квест, добавляем экспу за выполнение и выдаем надпись о полученном предмете и завершенном квесте.

Последняя часть самого большого скрипта на сегодня - сохранение.

Все что нужно сохранить это 1 float значение - количество убитых монстров на данный момент и bool переменную включен или нет скрипт. Все остальное автоматически подставиться при нажатии на кнопку выбора квеста.

Второй скрипт - QuestRefresher.

Те-же самые ссылки, необходим для того, чтобы после окончания квеста можно было легко очистить "правую сторону" квест бука. Закрыть панель с информацией о награде, убрать информацию о ненужном квесте и отключить кнопку "complete".


Используем метод Refresh() когда нам удобно - при открытии квест бука. Открывается окно, где необходимо выбрать нужный квест. При выборе вся информация обновится и подставиться в нужные места. Никаких Update.

Третий скрипт - QuestHelper(другого названия не придумал =) ).

Вешается на цель квеста. Указывается в инспекторе название квеста, а в методе смерти моба - вызывается метод AddQuestComponent() и в необходимый квест плюсуется 1 убийство.

Последний скрипт на сегодня - SaveLoadQuests.

Вешается на любой удобный объект, который не удаляется при переходе между сценами.

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

В итоге имеем - для создания нового квеста нужно:

- Продублировать любой объект в квест листе.

- Переименовать его, а так-же настроить информацию, название, награды и тд.

- Продублировать любую кнопку в "левой стороне" квест бука.

- Переименовать ее и в инспекторе указать путь к нужному квесту из квест листа.


Все. При открытии квест бука мы имеем окно, где необходимо выбрать нужный квест. Если он активен - тогда он есть в окне выбора. Если не активен - соответственно нет. В будущем можно создать еще 1 окно , куда будут попадать все выполненные квесты. При выборе квеста - вся информация обновляется автоматически. Для сохранения нам необходимо сохранять и загружать всего 2 значения.


Как-то так...  Принимаю любую критику и замечания. Опыта в программировании не много, поэтому уверен косяки найдутся)


Кому интересно посмотреть видео с демонстрацией работы - приглашаю в группу проекта:

https://vk.com/pathofdespair


Всем спасибо за внимание. Если есть вопросы - задавайте, постараюсь ответить.

Правила сообщества

ОБЩИЕ ПРАВИЛА:

- Уважайте чужой труд и используйте конструктивную критику

- Не занимайтесь саморекламой, пишите качественные и интересные посты

- Никакой политики


СТОИТ ПУБЛИКОВАТЬ:

- Посты о Вашей игре с историей её разработки и описанием полученного опыта

- Обучающие материалы, туториалы

- Интервью с опытными разработчиками

- Анонсы бесплатных мероприятий для разработчиков и истории их посещения;
- Ваши работы, если Вы художник/композитор и хотите поделиться ими на безвозмездной основе

НЕ СТОИТ ПУБЛИКОВАТЬ:

- Посты, содержащие только вопрос или просьбу помочь
- Посты, содержащие только идею игры

- Посты, единственная цель которых - набор команды для разработки игры

- Посты, не относящиеся к тематике сообщества

Подобные посты по решению администрации могут быть перемещены из сообщества в общую ленту.

ЗАПРЕЩЕНО:

- Публиковать бессодержательные посты с рекламой Вашего проекта (см. следующий пункт), а также все прочие посты, содержащие рекламу/рекламные интеграции

- Выдавать чужой труд за свой

Подобные посты будут перемещены из сообщества в общую ленту, а их авторы по решению администрации могут быть внесены в игнор-лист сообщества.


О РАЗМЕЩЕНИИ ССЫЛОК:

Ссылка на сторонний ресурс, связанный с игрой, допускается только при следующих условиях:

- Пост должен быть содержательным и интересным для пользователей, нести пользу для сообщества

- Ссылка должна размещаться непосредственно в начале или конце поста и только один раз

- Cсылка размещается в формате: "Страница игры в Steam: URL"

Вы смотрите срез комментариев. Показать все
3
Автор поста оценил этот комментарий
Основную задачу, которую я поставил перед собой - создать как можно меньше скриптов

Ну и зря, за краткость тебе вроде пока не платят.

В итоге имеем - для создания нового квеста нужно:
- Продублировать любую кнопку в "левой стороне" квест бука.
- Переименовать ее и в инспекторе указать путь к нужному квесту из квест листа.
Уф. В приличных места за такое с вертушки бьют)


Жесть короче полная, тебя такая реализация сожрет довольно быстро.

Сразу видно, что ты не смотрел ни одного учебного пособия по постройке системы квестов.

Завтра если не забуду, распишу тебе чутка о том, где ты не прав, и что с этим делать.


Спойлер. Везде.

раскрыть ветку (8)
4
Автор поста оценил этот комментарий

Короче суть такова.

У тебя должен быть какой-нить QuestUI, и в нем не должно содержаться ни какой информации о квестах. Только отображение информации, но не она сама. В нем должны быть перечислены все твои тексы, кнопки, картинки и т.д. (из первого скрина), в одном месте, а не в каждой кнопке, и методы типа :

SetListQuest(LIst<Quest> list)

Запускается при открытии окна, в него кидается лист со всеми квестами, и на основе этого листа, заполняешь перечень квестов в UI. (Так как ты делаешь, копированием UI элементов, это жопа) Лист должен формироваться сам. Сами элементы могут знать максимум о квесте только его id, не больше.

ShowQuestInfo(Quest selected) или SelectQuest(int id)

При клике на элемент списка, ты должен найти в листе нужный квест, и прокинуть в этот метод. Для заполнения правой части.


Где хранить квесты?

Если тебе охота настраивать все это в юньке, это нужно делать в скриптейбл объектах. Собирать "датабазы" в них.

Квест должен идти отдельным классом. Со всеми параметрами и информацией в нем. Он не должен наследоваться от монобехавиора.


Элементы квеста вроде получаемых вещей, задач, и т.д. должны быть реализоваты в виде списков с абстрактными классами. Ну вроде, делаешь класс "QuestTask", с абстрактным методом "IsСompleted", и потом "QuestTaskKill : QuestTask", "QuestTaskGetItems : QuestTask" и любые другие. Все это ложится в list<QuestTask> Tasks;

И у тебя может быть миллион задач в квесте, и тебе вообще не важно iskillquest или isitemquest, у квеста свой isCompleted, который прогоняет в цикле все задачи, и если все вполнены, то квест тоже значит выполнен.


Как считать мобов и предметы?

Делаешь глобальные события (каким именно образом решаешь сам), и при убийстве мобов или подборе предметов, спамишь события вида "убит моб такого типа".

А QuestSystem (или что там у тебя), подписывается на это событие, и при каждом убийстве моба, или подборе предмета, проверяет все в активных таски в квестах. И плюсует необходимые значения при совпадении. Все.

Мобы не должны знать ничего о квестах на них, им это нахер не нужно.

Ты заебешься на каждого моба вешать квесты.


Да и кнопка должна быть наверное не завершить квест, а получить награду)


А сохранение нужно сделать через сериализацию инфы активных квестов в json какой-нить, сразу, всю. А не сохранять по одному значению в префы.


Написал сумбурно, но если чо спрашивай, но лучше, посмотри лучше какой-нить курс халявный, это прям основы основ построения подобных систем.

@MrBillie,

раскрыть ветку (3)
1
Автор поста оценил этот комментарий

Большое спасибо за подробный ответ. Обязательно воспользуюсь!

0
Автор поста оценил этот комментарий

Тема почему не должно наследоваться от монобехавиора не раскрыта.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Тут я только могу посоветовать пойти почитать про то самое наследование. Зачем, почему и когда оно применяется. А потом задать себе вопрос, а что именно с этого монобехавиора я хочу то унаследовать.


Если хочется просто щупать руками параметры в редакторе, то это решается сериализованным классом, и скриптейбл объектом. Как я собственно и предлагал изначально.

0
Автор поста оценил этот комментарий

Я хз конечно, но стоит ли навязывать?Может просто ссылок накидать?

раскрыть ветку (3)
0
Автор поста оценил этот комментарий

Любая информация, если она нацелена на помощь - должна впитываться, анализироваться и использоваться:)

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Ну тогда крайне спорный подход к реализации квестов. Ещё довольно сомнительно сам код написан. Например публичные поля там, где этого не надо. Лишние атрибуты ещё. Короче не то, что можно смело показывать, показали бы просто работу системы в видео и все)

0
Автор поста оценил этот комментарий

Ссылки искать еще нужно. Это сидеть нужно читать/смотреть чтобы найти то, о чем я хочу поведать. Это очень интересно, да. Лучше уж самому коряво написать, но быстро)

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

Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества