Exemplo n.º 1
0
        /// <summary>
        /// Registers component type as one-frame for auto-removing at end of Run() call.
        /// </summary>
        public EcsSystems OneFrame <T> () where T : struct
        {
#if DEBUG
            if (_inited)
            {
                throw new Exception("Cant register one-frame after initialization.");
            }
            if (_oneFrames.ContainsKey(typeof(T)))
            {
                throw new Exception($"\"{typeof (T).Name}\" already registered as one-frame component.");
            }
#endif
            _oneFrames[typeof(T)] = World.GetFilter(typeof(EcsFilter <T>));
            return(this);
        }
Exemplo n.º 2
0
        /// <summary>
        /// Injects custom data to fields of ISystem instance.
        /// </summary>
        /// <param name="system">ISystem instance.</param>
        /// <param name="world">EcsWorld instance.</param>
        /// <param name="injections">Additional instances for injection.</param>
        public static void InjectDataToSystem(IEcsSystem system, EcsWorld world, Dictionary <Type, object> injections)
        {
            var systemType = system.GetType();
            var worldType  = world.GetType();
            var filterType = typeof(EcsFilter);
            var ignoreType = typeof(EcsIgnoreInjectAttribute);

            foreach (var f in systemType.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance))
            {
                // skip statics or fields with [EcsIgnoreInject] attribute.
                if (f.IsStatic || Attribute.IsDefined(f, ignoreType))
                {
                    continue;
                }
                // EcsWorld
                if (f.FieldType.IsAssignableFrom(worldType))
                {
                    f.SetValue(system, world);
                    continue;
                }
                // EcsFilter
#if DEBUG
                if (f.FieldType == filterType)
                {
                    throw new Exception($"Cant use EcsFilter type at \"{system}\" system for dependency injection, use generic version instead");
                }
#endif
                if (f.FieldType.IsSubclassOf(filterType))
                {
                    f.SetValue(system, world.GetFilter(f.FieldType));
                    continue;
                }
                // Other injections.
                foreach (var pair in injections)
                {
                    if (f.FieldType.IsAssignableFrom(pair.Key))
                    {
                        f.SetValue(system, pair.Value);
                        break;
                    }
                }
            }
        }