LeoECS - реализация событий в Entity Component System
Размещено
Быстрая обработка данных в LeoECS - это хорошо, но что насчет оповещения других систем о каких-либо событиях? В ECS-подходе это решается довольно просто.
Так как “все есть данные”, то мы можем представить любое событие как блок этих самых данных (компонент в терминах ECS), который в дальнейшем можем удалить после обработки всеми нужными системами. Удалять можно как отдельной системой, которая будет выполняться последней, так и автоматически с использованием специального атрибута. Пример создания события:
Если мы подключим обе системы в порядке их описания, то получим постоянно уменьшающийся запас здоровья у юнитов.
В ProcessDamageOnUnitsSystem-системе видно, что мы удаляем компонент события руками - это вполне нормальное решение, но что если нам нужно обработать данное событие несколькими системами и только после этого удалить? Для этого мы можем вынести удаление в отдельную систему, либо воспользоваться специальным атрибутом [EcsOneFrame]:
Код идентичный за исключением атрибута на компоненте DamageEvent и отсутствия явного удаления компонентов этого типа руками. Ядро ECS это сделает автоматически при вызове метода EcsWorld.RemoveOneFrameComponents:
void IEcsRunSystem.Run() { var dir = new Vector2 (Input.GetAxis ("Horizontal"), Input.GetAxis ("Vertical")); if (dir.sqrMagnitude > 0.1f) { var input = _world.CreateEntityWith<UserInput>(); input.Direction = dir; } } } [EcsInject] classProcessUserInputSystem : IEcsRunSystem { // Auto-injected fields. EcsWorld _world = null; EcsFilter<UserUnit> _unputs = null; EcsFilter<Unit> _units = null;
constfloat UnitSpeed = 10f;
void IEcsRunSystem.Run() { var speed = Time.deltaTime * UnitSpeed; foreach (var idx in _inputs) { var input = _inputs.Components1[idx]; foreach (var idx2 in _units) { _units.Components1[idx2].Position += input.Direction * speed; } } } }
По сути данный подход напоминает “шину событий” (EventBus) - события могут обработаться всей последовательностью систем, а так же обработка может быть прекращена любой системой в момент ее выполнения.