Path Of Despair, quest system

Всем привет.

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

Path Of Despair, quest system Unity, RPG, Инди, Low poly, Blender, C, Длиннопост

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

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

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

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

Path Of Despair, quest system Unity, RPG, Инди, Low poly, Blender, C, Длиннопост

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

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

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

Path Of Despair, quest system Unity, RPG, Инди, Low poly, Blender, C, Длиннопост

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

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

Path Of Despair, quest system Unity, RPG, Инди, Low poly, Blender, C, Длиннопост

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

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

Path Of Despair, quest system Unity, RPG, Инди, Low poly, Blender, C, Длиннопост

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

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

Path Of Despair, quest system Unity, RPG, Инди, Low poly, Blender, C, Длиннопост

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

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

Path Of Despair, quest system Unity, RPG, Инди, Low poly, Blender, C, Длиннопост

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

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


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

Path Of Despair, quest system Unity, RPG, Инди, Low poly, Blender, C, Длиннопост

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

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

Path Of Despair, quest system Unity, RPG, Инди, Low poly, Blender, C, Длиннопост

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

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

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

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

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

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

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

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


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


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


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

https://vk.com/pathofdespair


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

Лига Разработчиков Видеоигр

6.8K пост22.2K подписчиков

Добавить пост

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

ЗАПРЕЩЕНО:

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

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

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


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

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

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

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

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