Ejemplo n.º 1
0
        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);
            ;
        }
Ejemplo n.º 2
0
        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);
                }
            }
        }