Skip to content

Brief implementation of the characters ability mechanism

Notifications You must be signed in to change notification settings

playstel/skills_system

Repository files navigation

Задача

  1. Как бы вы реализовали абстрактный механизм способностей персонажей?

  2. Какие ключевые классы и интерфейсы выделили бы?

  3. Каким способом добились бы гибкой настройки со стороный гейм дизайн отдела и минимизировали вмешательство отдела разработки в создание новых вариаций способоностей? В качестве примера можно описать реализацию способности "Исцеление""Массовое исцеление" и способности "Нанесение урона""Массовое нанесение урона"?

Описание

Информация о скиллах может храниться как локально (см. Scripts/Base/ScriptableObject), так и на сервере(см. Scripts/Network).

В этом проекте рассмотрим оба случая.

-Для локального хранения/редактирования используем ScriptableObject и Sirenix Odin Inspector

-Для получения информации о скиллах с сервера используем UnityWebRequest, UniTask, Newtonsoft.Json


Затронем следующие пункты:

-Класс Unit и класс UnitSkill

-Локальное хранилище способностей

-Локальное хранилище персонажей

-Получение информации из БД сервера с помощью REST API

-Локатор сервисов

-Интерфейсы

-Скрипты персонажа

-Тест

Класс Unit

В начале создадим класс Unit, который содержит имя (Warrior, Wizzard) и коллекцию скиллов

Снимок экрана 2023-10-05 в 08 58 58

Класс UnitSkill

Далее создадим класс UnitSkill, который включает в себя:

-название скилла (Heal, MassHeal, Damage, MassDamage)

-тип (InstantUse, RadiusAroundUnit, Throw, MelleHit)

-описание (SkillNameText, SkillDescriptionText, SkillImageByteCode)

-использование (SkillUseCost, SkillCooldownMsec)

-зона поражения (SkillMaxThrowDistance, SkillThrowPower, SkillZoneRadius)

-воздействие на персонажей (ImpactHealthPoints, ImpactSpeedPoints, ImpactDurationMsec, ImpactFX)

Снимок экрана 2023-10-05 в 08 59 26

Подробнее см. в проекте Scripts/Base/Class/ClassUnit.cs

Снимок экрана 2023-10-05 в 09 21 48

Локальное хранилище способностей

Чтобы визуализировать класс скиллов, создадим класс LocalUnitSkills и наследуем от ScriptableObject:

Снимок экрана 2023-10-05 в 09 11 54

Далее в инспекторе можно создать и гибко настроить несколько его экземпляров:

Heal

Снимок экрана 2023-10-05 в 09 27 20

Mass Heal

Снимок экрана 2023-10-05 в 09 27 38

Damage

Снимок экрана 2023-10-05 в 09 27 56

Mass Damage (в данном случае - заморозка персонажей)

Снимок экрана 2023-10-05 в 09 28 21

Путь до локального хранилища скиллов: ScriptableObjects/Unit

Снимок экрана 2023-10-06 в 14 06 54

Локальное хранилище персонажей

По аналогии создадим ScriptableObject для персонажей

Снимок экрана 2023-10-05 в 09 40 50

И закрепим за ними подходящие скиллы:

Снимок экрана 2023-10-05 в 09 40 25

Путь до локального хранилища персонажей аналогичный: ScriptableObjects/Unit

Снимок экрана 2023-10-06 в 14 07 08

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

Получение информации из БД сервера с помощью REST API

Теперь мы можем легко редактировать параметры скиллов персонажей и создавать новые вариации способоностей. Однако информация о скиллах все еще находится в Unity и зависит от сборки.

При наличии сервера лучше создать в нем базу данных скиллов и получать ее по REST API перед каждым запуском игры. Редактируя записи в конфигурации на сервере, можно изменять параметры игры в любое время и не беспокоить пользователей необходимостью обновлять приложение, чтобы получить актуальную версию скиллов.


Для этого создадим скрипт WebRequest, который будет отправлять GET запрос на потенциальный сервер через UnityWebRequest (см. Scripts/Network/WebRequest.cs)

Снимок экрана 2023-10-05 в 09 48 00

Далее создадим надстройку WebRequestUnit.cs и метод GET_UnitSkills, который будет формировать конкретный запрос для скиллов, получать респонс с сервера, а затем десериализировать его с помощью Newtonsoft.Json.JsonConvert:

Снимок экрана 2023-10-05 в 09 49 34

Создадим ScriptableObject, который будет хранить путь к серверным запросам (для навигации в серверных запросах можно воспользоваться Swagger UI)

Снимок экрана 2023-10-05 в 09 50 50

Путь до хранилища серверных запросов:

Снимок экрана 2023-10-06 в 14 07 59

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

Локатор сервисов

Теперь мы имеем возможность получать информацию о скиллах как локально, так и с помощью сервера.

Чтобы обращаться к ней из любых скриптов проекта, создадим ServiceLocatior.cs, сделаем из него static singleton

Снимок экрана 2023-10-05 в 10 11 21

Cоздаем скрипты, которые будут хранить ссылки на инструменты работы с серверными запросами, а так же с локальной БД персонажей и их способностей:

Снимок экрана 2023-10-05 в 10 17 58

Чтобы была возможность обратиться к этим скриптам, они должны быть дочерними для gameObject с нашим компонентом ServiceLocator.cs. Далее в нем напишем метод получения дочерних объектов по их типу:

Снимок экрана 2023-10-05 в 10 22 10

Теперь мы можем обратиться к информации о скиллах из любого интересующего нас места через ServiceLocator.

Для масштабных проектов вместо ServiceLocatior лучше использовать фреймворк Zenject - он более гибкий в использовнии.

Интерфейсы

Так же для удобства создадим интерфейсы, которые будут отвечать за здоровье/скорость/эффекты/скиллы персонажа:

Снимок экрана 2023-10-05 в 10 36 02

Например, здоровье персонажа:

Снимок экрана 2023-10-05 в 10 36 39

Пример использования:

Снимок экрана 2023-10-05 в 10 37 08

Снимок экрана 2023-10-05 в 10 36 57

Скрипты персонажа

Приступим к генерации героев и скиллов. Для этого создадим скрипт UnitList.cs, в котором можно выбрать тип получения скиллов - с помощью локальной базы данных ScriptableObject или через RestApi. Для этого используем переключатель UseRestApi

Снимок экрана 2023-10-05 в 09 55 19

Когда экземляр персонажа создан, добавим и инциализируем его игровые компоненты (Health, Skills, Speed, VisualEffect, Impact):

Снимок экрана 2023-10-05 в 10 24 08

Рассмотрим UnitSkills.cs подробнее. На старте мы получаем скиллы с помощью ServiceLocator, либо из базы данных сервера через запрос из WebRequestUnit, либо через локальную базу данных через запрос из UnitLocalSource

Снимок экрана 2023-10-05 в 10 27 58

Получив информацию о скиллах, мы можем провести небольшой тест:

Снимок экрана 2023-10-05 в 10 31 49

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

Снимок экрана 2023-10-05 в 10 32 05

Тест

В папке проекта ScriptableObjects/Unit хранятся данные о способностях, которые можно добавлять/убирать/редактировать

Запустим проект и проверим консоль:

Снимок экрана 2023-10-05 в 09 42 18

Тест с REST API

Eсли имеется сервер с готовыми скиллами и вы хотите получить их через Rest API, тогда поставьте галочку UseRestApi в скрипте UnitList.cs

Снимок экрана 2023-10-06 в 14 05 46

Заполните URL и токен в запросе WebRequestUnit.cs

Снимок экрана 2023-10-06 в 12 28 59

И укажите URL адреса запросов в UrlUnit из папки ScriptableObjects/Swagger Url:

Снимок экрана 2023-10-06 в 12 31 20

Ссылки

Больше проектов можно найти на моей сайте https://playstel.com/

About

Brief implementation of the characters ability mechanism

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published