System Group
Описание
Модуль SystemGroup
предоставляет механизм для группировки и управления порядком выполнения Систем в ECS фреймворке. Группы систем связаны с Signal и получают данные для передачи в Системы.
Назначение
- Управление порядком выполнения Систем
- Передача данных от Signal в Системы
- Переопределение зависимостей для Систем
- Расширение фильтрации Систем
- Условное и повторное выполнение Систем
Архитектура
Основные классы
- SystemGroup - абстрактный класс для создания групп
- IGroupOption - интерфейс настроек для Системы
- ISystemProvider - провайдер для создания Системы
Использование
Создание группы
class MovementGroup extends SystemGroup<Vec2> {
public setup(chain: SystemChain, data: Vec2): void {
chain
.add(MovementSystem) // Простая регистрация
.add(VelocitySystem, data) // С передачей данных
.add(
CollisionSystem, // С дополнительным фильтром
{
includes: [ColliderComponent],
excludes: [DisabledComponent]
}
)
.add(PhysicsSystem, { repeat: 3 }) // С повторным выполнением
.add(
AnimationSystem, // С условным выполнением
{ canExecute: (data) => data.x !== 0 || data.y !== 0 }
);
}
// Переопределение зависимостей
protected setupDependencies(): Provider[] {
return [
{
provide: AbstractPhysicsService,
useClass: CustomPhysicsService
}
];
}
}
Порядок выполнения
Все Системы выполняются в порядке добавления в цепочку вызовов. Никаких дополнительных настроек для ордеринга не требуется. Если подразумевается данимачисекий порядок выполнения, проще реализовать отдельные группы под каждый кейс.
Важно такде понимать, если Система возвращает Promise, то выполнение последующих в цепочке Группы Систем будет дожидатся разрешения Промиса текущей Системы.
chain
.add(FirstSystem) // Выполнится FirstSystem
.add(SecondSystem); // После выполнится SecondSystem
API
Класс SystemGroup
Методы
setup(chain: SystemChain, data?: T): void
- определяет порядок и настройки выполнения СистемsetupDependencies(): Provider[]
- определяет зависимости для Систем в группе
Интерфейс IGroupOption
interface IGroupOption {
instance: ISystemProvider; // Провайдер системы
includes?: ComponentType[]; // Дополнительные компоненты для фильтрации
excludes?: ComponentType[]; // Исключаемые компоненты
order?: number; // Порядок выполнения
repeat?: number; // Количество повторений
withDisabled?: boolean; // Включать ли неактивные сущности
canExecute?: (data: any) => boolean; // Условие выполнения
}
FAQ
Как определяется порядок выполнения Систем?
- По свойству
order
, если оно указано - По порядку объявления в методе
setup
, с шагом 10000 между системами
Как работают повторения Систем?
Система будет выполнена указанное в repeat
количество раз перед переходом к следующей системе.
Как переопределяются зависимости?
- Зависимости определяются в методе
setupDependencies
- Они регистрируются в ServiceContainer с уникальным ID группы
- При запросе зависимости через @Inject, сначала ищутся зависимости группы, затем глобальные
Можно ли изменить порядок выполнения динамически?
Да, метод setup
вызывается при каждом срабатывании Signal, поэтому порядок может меняться на основе входных данных.