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"

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,

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

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

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

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

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

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

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


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

Постараюсь :)

Темы

Политика

Теги

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

Сообщества

18+

Теги

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

Сообщества

Игры

Теги

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

Сообщества

Юмор

Теги

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

Сообщества

Отношения

Теги

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

Сообщества

Здоровье

Теги

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

Сообщества

Путешествия

Теги

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

Сообщества

Спорт

Теги

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

Сообщества

Хобби

Теги

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

Сообщества

Сервис

Теги

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

Сообщества

Природа

Теги

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

Сообщества

Бизнес

Теги

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

Сообщества

Транспорт

Теги

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

Сообщества

Общение

Теги

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

Сообщества

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

Теги

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

Сообщества

Наука

Теги

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

Сообщества

IT

Теги

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

Сообщества

Животные

Теги

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

Сообщества

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

Теги

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

Сообщества

Экономика

Теги

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

Сообщества

Кулинария

Теги

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

Сообщества

История

Теги

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

Сообщества