Перейти к основному содержимому

System Group

Описание

Модуль SystemGroup предоставляет механизм для группировки и управления порядком выполнения Систем в ECS фреймворке. Группы систем связаны с Signal и получают данные для передачи в Системы.

Назначение

  • Управление порядком выполнения Систем
  • Передача данных от Signal в Системы
  • Переопределение зависимостей для Систем
  • Расширение фильтрации Систем
  • Условное и повторное выполнение Систем

Архитектура

Основные классы

  1. SystemGroup - абстрактный класс для создания групп
  2. IGroupOption - интерфейс настроек для Системы
  3. 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

Как определяется порядок выполнения Систем?

  1. По свойству order, если оно указано
  2. По порядку объявления в методе setup, с шагом 10000 между системами

Как работают повторения Систем?

Система будет выполнена указанное в repeat количество раз перед переходом к следующей системе.

Как переопределяются зависимости?

  1. Зависимости определяются в методе setupDependencies
  2. Они регистрируются в ServiceContainer с уникальным ID группы
  3. При запросе зависимости через @Inject, сначала ищутся зависимости группы, затем глобальные

Можно ли изменить порядок выполнения динамически?

Да, метод setup вызывается при каждом срабатывании Signal, поэтому порядок может меняться на основе входных данных.