Система навыков с графовой структурой для Unity, реализующая механику изучения и забывания навыков.
Система навыков, где каждый навык может быть изучен только при наличии изученных предшествующих навыков. Графовая структура с базовой вершиной, которая по дефолту изучена и не может быть забыта.
- VContainer (DI Framework)
Clean Architecture с разделением на слои:
-
Data Layer (данные): ScriptableObject конфигурации, PlayerProgressionData
-
Domain Layer (бизнес логика): SkillGraph, SkillService, Skill
-
Presentation Layer (логика интерфейса): SkillScreenPresenter (MVP)
-
View Layer (логика отображения): SkillsScreenView, SkillNodeView
-
Расположенные .asmdef файлы наглядно определяют область видимости слоёв и снижают вероятность нарушения области видимости (напр, чтобы в View слой случайно не привнести зависимость от типа в Data слое)
- Data не видит никого
- Domain видит только Data
- Presentation видит Domain и View
- View не видит никого
- Dependency Injection: VContainer
- MVP: разделение ответственности
- Observer Pattern: события для UI
- SkillGraph: состяние графа, алгоритмы проверки на возможность изучить и забыть навык
- SkillService: управление навыками и события обновления состояния модели
- SkillScreenPresenter: связь UI и модели, логика интерфейса
- SkillScreenView: логика отображения
- Граф описывается в ScriptableObject (SkillGraphSO)
- Предоставляет возможность провалидировать описанный граф в Editor (проверка на отсутствие дублей, проверка двусторонней связи между нодами, отсутствие изолированных нод)
- Зависимость Presentation от интерфейсов, а не от конкретных реализаций
- test-friendly
MonoBehaviorкомпоненты есть только в View слое
- Убрать/Инкапсулировать прямые вызовы
Debug.Log/Warning/Errorиз классов с логикой в отдельные Loggers- В качестве упрощения и экономия времени не стал делать в рамках тестового
- Инкапсулировать получение данных из конфига в каком-нибудь DataProvider в Data-слое
- Будет проще изменить источник получения конфига (Сейчас конфиг хранится в SO и прокидывается как SO)
SkillScreenViewв дальнейшем может быть разбить на 2 более специализированных модуляSkillGraphViewбудет ответственнен за отрисовку графаSkillControlPanelViewза панель справа с кнопками и описанием скилла- В свою очередь можно будет избавиться от
SkillScreenViewили превратить его в Facade
- Добавление сохранения состояния между сессиями
- В Data слое можно создать
PersistenseStorageService, который будет предоставлять интерфейс для сохранения и загрузки данных- Способ сохранения (детали реализации) инкапсулируется в этом слое
- Сохранять можно количество SkillPoints (
PlayerProgressionData) и состояние графа (SkillGraph)
- В Data слое можно создать
- Если понадобится, можно подумать о нового слоя Infrastructure для более инфраструктурного кода
- Работа с файловой системой
- Работа с локальной БД
- Отправка веб-запросов API
- Обёртки над SDK (напр. получение Remote Config через Firebase)
- Добавить Unit тесты