/// <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); }
/// <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; } } } }