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 значения.
Как-то так... Принимаю любую критику и замечания. Опыта в программировании не много, поэтому уверен косяки найдутся)
Кому интересно посмотреть видео с демонстрацией работы - приглашаю в группу проекта:
Всем спасибо за внимание. Если есть вопросы - задавайте, постараюсь ответить.









Ну и зря, за краткость тебе вроде пока не платят.
Уф. В приличных места за такое с вертушки бьют)Жесть короче полная, тебя такая реализация сожрет довольно быстро.
Сразу видно, что ты не смотрел ни одного учебного пособия по постройке системы квестов.
Завтра если не забуду, распишу тебе чутка о том, где ты не прав, и что с этим делать.
Спойлер. Везде.