EntitySystem.cs 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. using MonoGame.Extended.Collections;
  2. namespace MonoGame.Extended.ECS.Systems
  3. {
  4. public abstract class EntitySystem : ISystem
  5. {
  6. protected EntitySystem(AspectBuilder aspectBuilder)
  7. {
  8. _aspectBuilder = aspectBuilder;
  9. }
  10. public void Dispose()
  11. {
  12. if (_world != null)
  13. {
  14. _world.EntityManager.EntityAdded -= OnEntityAdded;
  15. _world.EntityManager.EntityRemoved -= OnEntityRemoved;
  16. }
  17. }
  18. private readonly AspectBuilder _aspectBuilder;
  19. private EntitySubscription _subscription;
  20. private World _world;
  21. protected virtual void OnEntityChanged(int entityId) { }
  22. protected virtual void OnEntityAdded(int entityId) { }
  23. protected virtual void OnEntityRemoved(int entityId) { }
  24. public Bag<int> ActiveEntities => _subscription.ActiveEntities;
  25. public virtual void Initialize(World world)
  26. {
  27. _world = world;
  28. var aspect = _aspectBuilder.Build(_world.ComponentManager);
  29. _subscription = new EntitySubscription(_world.EntityManager, aspect);
  30. _world.EntityManager.EntityAdded += OnEntityAdded;
  31. _world.EntityManager.EntityRemoved += OnEntityRemoved;
  32. _world.EntityManager.EntityChanged += OnEntityChanged;
  33. Initialize(world.ComponentManager);
  34. }
  35. public abstract void Initialize(IComponentMapperService mapperService);
  36. protected void DestroyEntity(int entityId) => _world.DestroyEntity(entityId);
  37. protected Entity CreateEntity() => _world.CreateEntity();
  38. protected Entity GetEntity(int entityId) => _world.GetEntity(entityId);
  39. }
  40. }