public static void FilterWithDispatcher <TDispatcher>(this EcsSystem system, Func <TDispatcher, int> getMatchId, Action <int> handler, params Type[] forTypes) where TDispatcher : EcsDispatcher { system.OnEvent <ComponentCreatedEvent>().Where(p => forTypes.Contains(p.Component.GetType())) .Subscribe(_ => { var component = _.Component as EcsComponent; if (component == null) { return; } var d = component.gameObject.GetComponent <TDispatcher>(); if (d != null) { return; } var entityId = component.EntityId; component.gameObject .AddComponent <TDispatcher>() .EntityId = entityId ; system.OnEvent <TDispatcher>() .Where(p => getMatchId(p) == component.EntityId) .Subscribe(x => handler(x.EntityId)) .DisposeWith(system); }) .DisposeWith(system); ; }
public static IEnumerable <IEcsComponent> MergeByEntity(this EcsSystem system, params IEcsComponentManager[] managers) { var list = new HashSet <int>(); foreach (var manager in managers) { foreach (var item in manager.All) { if (list.Contains(item.EntityId)) { continue; } yield return(item); list.Add(item.EntityId); } } }