Однажды я задался вопросом, как максимально развязать код в угоду шаблонам High Cohesion и Low Coupling. И вот, гуляя по парку мне пришла в голову идея использовать EventBus как точку связанности механик игры. Иначе говоря, положить EventBus в основу и всю связанность передать ему. Это чем-то похоже на логику WebSocket. К тому же на курсе от Otus, на котором я обучался, подошло время финальных проектов и я решил попробовать реализовать эту идею.
В версии 0.0.1 проекта в игре есть 2 сущности: игрок (Player) и враг (Enemy). Сущности являются контейнерами для механик и компонентов. Компоненты - это чистые данные с минимумом логики. Механики - это чистая логика, которая берет все нужные данные из компонентов. Механики взаимодействуют между собой через EventBus, подписываясь и создавая события и запросы. Заметили схожесть с ECS? Верно! Данная система оказалось очень похожа на логику работы ECS систем. Схему компоненты-механики-сущности я использую второй раз. Я думаю, это мой личная компиляция идей из разных направлений проектирования архитектуры. Это одновременно легко пишется, легко читается, легко масштабируется. Минусов не будет.
Так как игра в основном личный эксперимент, то я не тратил время на придумывание интересного геймплея. Игровой цикл максимально прост - бегаем по карте, убиваем врага, получаем патроны и по новой.
Передвижение - wasd. Управление камерой - мышь. Также работает в некоторой степени поддержка контроллера. Переключение между оружием по цифрам:
- Пистолет
- Автомат
Механики:
- Механика преследования игрока врагом
- Механика стрельбы
- Механика звука и визуала стрельбы
- Механика перезарядки
- Механика хранения патронов и учета для разных видов оружия
- Механика смены оружия
- Механика перемещения игрока и его звуки
- Механика спавна и распределения по карте врагов
- Механика хп и дамага
Анимации:
- Анимация врага в трех состояниях (ожидание, бег, удары)
- Анимация отдачи оружия
Визуал:
- Спец. эффекты оружия
- Постобработка
- UI хп
- UI запаса патронов
- Модельки города, оружия, врага были найдены и адаптированы
Аудио:
- Аудио глока в трех состояниях (выстрел, перезарядка, пустая обойма)
- Аудио М1 в трех состояниях (выстрел, перезарядка, пустая обойма)
Также:
- Использована система NavMeshAgent'a для перемещения игрока
- Какой никакой AI с памятью об игроке
- Система распределения врагов по карте
- Эффекты от попадания пуль в двух вариантах: враг и окружение