Entitas  0.40.0
Entitas is a super fast Entity Component System (ECS) Framework specifically made for C# and Unity
Collector.cs
1 using System.Collections.Generic;
2 using System.Text;
3 
4 namespace Entitas {
5 
6  /// A Collector can observe one or more groups from the same context
7  /// and collects changed entities based on the specified groupEvent.
8  public class Collector<TEntity> where TEntity : class, IEntity, new() {
9 
10  /// Returns all collected entities.
11  /// Call collector.ClearCollectedEntities()
12  /// once you processed all entities.
13  public HashSet<TEntity> collectedEntities { get { return _collectedEntities; } }
14 
15  readonly HashSet<TEntity> _collectedEntities;
16  readonly IGroup<TEntity>[] _groups;
17  readonly GroupEvent[] _groupEvents;
18 
19  GroupChanged<TEntity> _addEntityCache;
20  string _toStringCache;
21  StringBuilder _toStringBuilder;
22 
23  /// Creates a Collector and will collect changed entities
24  /// based on the specified groupEvent.
25  public Collector(IGroup<TEntity> group, GroupEvent groupEvent) : this(new[] { group }, new[] { groupEvent }) {
26  }
27 
28  /// Creates a Collector and will collect changed entities
29  /// based on the specified groupEvents.
30  public Collector(IGroup<TEntity>[] groups, GroupEvent[] groupEvents) {
31  _groups = groups;
32  _collectedEntities = new HashSet<TEntity>(EntityEqualityComparer<TEntity>.comparer);
33  _groupEvents = groupEvents;
34 
35  if(groups.Length != groupEvents.Length) {
36  throw new CollectorException(
37  "Unbalanced count with groups (" + groups.Length +
38  ") and group events (" + groupEvents.Length + ").",
39  "Group and group events count must be equal."
40  );
41  }
42 
43  _addEntityCache = addEntity;
44  Activate();
45  }
46 
47  /// Activates the Collector and will start collecting
48  /// changed entities. Collectors are activated by default.
49  public void Activate() {
50  for(int i = 0; i < _groups.Length; i++) {
51  var group = _groups[i];
52  var groupEvent = _groupEvents[i];
53  switch(groupEvent) {
54  case GroupEvent.Added:
55  group.OnEntityAdded -= _addEntityCache;
56  group.OnEntityAdded += _addEntityCache;
57  break;
58  case GroupEvent.Removed:
59  group.OnEntityRemoved -= _addEntityCache;
60  group.OnEntityRemoved += _addEntityCache;
61  break;
62  case GroupEvent.AddedOrRemoved:
63  group.OnEntityAdded -= _addEntityCache;
64  group.OnEntityAdded += _addEntityCache;
65  group.OnEntityRemoved -= _addEntityCache;
66  group.OnEntityRemoved += _addEntityCache;
67  break;
68  }
69  }
70  }
71 
72  /// Deactivates the Collector.
73  /// This will also clear all collected entities.
74  /// Collectors are activated by default.
75  public void Deactivate() {
76  for(int i = 0; i < _groups.Length; i++) {
77  var group = _groups[i];
78  group.OnEntityAdded -= _addEntityCache;
79  group.OnEntityRemoved -= _addEntityCache;
80  }
82  }
83 
84  /// Clears all collected entities.
85  public void ClearCollectedEntities() {
86  foreach(var entity in _collectedEntities) {
87  entity.Release(this);
88  }
89  _collectedEntities.Clear();
90  }
91 
92  void addEntity(IGroup<TEntity> group, TEntity entity, int index, IComponent component) {
93  var added = _collectedEntities.Add(entity);
94  if(added) {
95  entity.Retain(this);
96  }
97  }
98 
99  public override string ToString() {
100  if(_toStringCache == null) {
101  if(_toStringBuilder == null) {
102  _toStringBuilder = new StringBuilder();
103  }
104  _toStringBuilder.Length = 0;
105  _toStringBuilder.Append("Collector(");
106 
107  const string separator = ", ";
108  var lastSeparator = _groups.Length - 1;
109  for(int i = 0; i < _groups.Length; i++) {
110  _toStringBuilder.Append(_groups[i]);
111  if(i < lastSeparator) {
112  _toStringBuilder.Append(separator);
113  }
114  }
115 
116  _toStringBuilder.Append(")");
117  _toStringCache = _toStringBuilder.ToString();
118  }
119 
120  return _toStringCache;
121  }
122 
123  ~Collector() {
124  Deactivate();
125  }
126  }
127 }
void ClearCollectedEntities()
Clears all collected entities.
Definition: Collector.cs:85
HashSet< TEntity > collectedEntities
Definition: Collector.cs:13
Collector(IGroup< TEntity >[] groups, GroupEvent[] groupEvents)
Definition: Collector.cs:30
Collector(IGroup< TEntity > group, GroupEvent groupEvent)
Definition: Collector.cs:25
void Deactivate()
Definition: Collector.cs:75