mirror of
https://github.com/DCFApixels/DragonECS.git
synced 2025-09-18 01:44:35 +08:00
add IInjectionBlock
This commit is contained in:
parent
5760dd55d0
commit
36d5c15817
@ -5,6 +5,23 @@ using System.Linq;
|
||||
|
||||
namespace DCFApixels.DragonECS
|
||||
{
|
||||
public readonly struct Injector
|
||||
{
|
||||
private readonly EcsPipeline _pipeline;
|
||||
public Injector(EcsPipeline pipeline)
|
||||
{
|
||||
_pipeline = pipeline;
|
||||
}
|
||||
public void Inject<T>(T data)
|
||||
{
|
||||
_pipeline.Inject(data);
|
||||
}
|
||||
}
|
||||
public interface IInjectionBlock
|
||||
{
|
||||
void InjectTo(Injector i);
|
||||
}
|
||||
|
||||
[MetaName(nameof(PreInject))]
|
||||
[BindWithEcsRunner(typeof(EcsPreInjectRunner))]
|
||||
public interface IEcsPreInject : IEcsProcess
|
||||
@ -56,7 +73,14 @@ namespace DCFApixels.DragonECS
|
||||
{
|
||||
void IEcsPreInject.PreInject(object obj)
|
||||
{
|
||||
foreach (var item in targets) item.PreInject(obj);
|
||||
if (obj is IInjectionBlock container)
|
||||
{
|
||||
container.InjectTo(new Injector(Pipeline));
|
||||
}
|
||||
foreach (var item in targets)
|
||||
{
|
||||
item.PreInject(obj);
|
||||
}
|
||||
}
|
||||
}
|
||||
[MetaTags(MetaTags.HIDDEN)]
|
||||
@ -74,9 +98,9 @@ namespace DCFApixels.DragonECS
|
||||
{
|
||||
Type baseType = typeof(T).BaseType;
|
||||
if (baseType != typeof(object) && baseType != typeof(ValueType) && baseType != null)
|
||||
_baseTypeInjectRunner = (EcsBaseTypeInjectRunner)Activator.CreateInstance(typeof(EcsBaseTypeInjectRunner<>).MakeGenericType(baseType), Source);
|
||||
_baseTypeInjectRunner = (EcsBaseTypeInjectRunner)Activator.CreateInstance(typeof(EcsBaseTypeInjectRunner<>).MakeGenericType(baseType), Pipeline);
|
||||
else
|
||||
_baseTypeInjectRunner = new EcsObjectTypePreInjectRunner(Source);
|
||||
_baseTypeInjectRunner = new EcsObjectTypePreInjectRunner(Pipeline);
|
||||
}
|
||||
}
|
||||
internal abstract class EcsBaseTypeInjectRunner
|
||||
@ -155,7 +179,10 @@ namespace DCFApixels.DragonECS
|
||||
|
||||
public static partial class EcsPipelineExtensions
|
||||
{
|
||||
public static void Inject<T>(EcsPipeline self, T data) => self.GetRunner<IEcsInject<T>>().Inject(data);
|
||||
public static void Inject<T>(this EcsPipeline self, T data)
|
||||
{
|
||||
self.GetRunner<IEcsInject<T>>().Inject(data);
|
||||
}
|
||||
}
|
||||
public static partial class EcsPipelineBuilderExtensions
|
||||
{
|
||||
@ -167,33 +194,33 @@ namespace DCFApixels.DragonECS
|
||||
self.AddModule(module);
|
||||
return self;
|
||||
}
|
||||
public static EcsPipeline.Builder Inject<A, B>(this EcsPipeline.Builder self, A a, B b)
|
||||
public static EcsPipeline.Builder Inject<T0, T1>(this EcsPipeline.Builder self, T0 d0, T1 d1)
|
||||
{
|
||||
return self.Inject(a).Inject(b);
|
||||
return self.Inject(d0).Inject(d1);
|
||||
}
|
||||
public static EcsPipeline.Builder Inject<A, B, C>(this EcsPipeline.Builder self, A a, B b, C c)
|
||||
public static EcsPipeline.Builder Inject<T0, T1, T2>(this EcsPipeline.Builder self, T0 d0, T1 d1, T2 d2)
|
||||
{
|
||||
return self.Inject(a).Inject(b).Inject(c);
|
||||
return self.Inject(d0).Inject(d1).Inject(d2);
|
||||
}
|
||||
public static EcsPipeline.Builder Inject<A, B, C, D>(this EcsPipeline.Builder self, A a, B b, C c, D d)
|
||||
public static EcsPipeline.Builder Inject<T0, T1, T2, T3>(this EcsPipeline.Builder self, T0 d0, T1 d1, T2 d2, T3 d3)
|
||||
{
|
||||
return self.Inject(a).Inject(b).Inject(c).Inject(d);
|
||||
return self.Inject(d0).Inject(d1).Inject(d2).Inject(d3);
|
||||
}
|
||||
public static EcsPipeline.Builder Inject<A, B, C, D, E>(this EcsPipeline.Builder self, A a, B b, C c, D d, E e)
|
||||
public static EcsPipeline.Builder Inject<T0, T1, T2, T3, T4>(this EcsPipeline.Builder self, T0 d0, T1 d1, T2 d2, T3 d3, T4 d4)
|
||||
{
|
||||
return self.Inject(a).Inject(b).Inject(c).Inject(d).Inject(e);
|
||||
return self.Inject(d0).Inject(d1).Inject(d2).Inject(d3).Inject(d4);
|
||||
}
|
||||
public static EcsPipeline.Builder Inject<A, B, C, D, E, F>(this EcsPipeline.Builder self, A a, B b, C c, D d, E e, F f)
|
||||
public static EcsPipeline.Builder Inject<T0, T1, T2, T3, T4, T5>(this EcsPipeline.Builder self, T0 d0, T1 d1, T2 d2, T3 d3, T4 d4, T5 f)
|
||||
{
|
||||
return self.Inject(a).Inject(b).Inject(c).Inject(d).Inject(e).Inject(f);
|
||||
return self.Inject(d0).Inject(d1).Inject(d2).Inject(d3).Inject(d4).Inject(f);
|
||||
}
|
||||
public static EcsPipeline.Builder Inject<A, B, C, D, E, F, G>(this EcsPipeline.Builder self, A a, B b, C c, D d, E e, F f, G g)
|
||||
public static EcsPipeline.Builder Inject<T0, T1, T2, T3, T4, T5, T6>(this EcsPipeline.Builder self, T0 d0, T1 d1, T2 d2, T3 d3, T4 d4, T5 f, T6 d6)
|
||||
{
|
||||
return self.Inject(a).Inject(b).Inject(c).Inject(d).Inject(e).Inject(f).Inject(g);
|
||||
return self.Inject(d0).Inject(d1).Inject(d2).Inject(d3).Inject(d4).Inject(f).Inject(d6);
|
||||
}
|
||||
public static EcsPipeline.Builder Inject<A, B, C, D, E, F, G, H>(this EcsPipeline.Builder self, A a, B b, C c, D d, E e, F f, G g, H h)
|
||||
public static EcsPipeline.Builder Inject<T0, T1, T2, T3, T4, T5, T6, T7>(this EcsPipeline.Builder self, T0 d0, T1 d1, T2 d2, T3 d3, T4 d4, T5 f, T6 d6, T7 d7)
|
||||
{
|
||||
return self.Inject(a).Inject(b).Inject(c).Inject(d).Inject(e).Inject(f).Inject(g).Inject(h);
|
||||
return self.Inject(d0).Inject(d1).Inject(d2).Inject(d3).Inject(d4).Inject(f).Inject(d6).Inject(d7);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -38,16 +38,21 @@ namespace DCFApixels.DragonECS
|
||||
#endregion
|
||||
|
||||
#region Runners
|
||||
public T[] GetSystems<T>() where T : IEcsProcess
|
||||
{
|
||||
return _allSystems.Where(o => o is T).Select(o => (T)o).ToArray();
|
||||
}
|
||||
public T GetRunner<T>() where T : IEcsProcess
|
||||
{
|
||||
Type type = typeof(T);
|
||||
if (_runners.TryGetValue(type, out IEcsRunner result))
|
||||
{
|
||||
return (T)result;
|
||||
}
|
||||
result = (IEcsRunner)EcsRunner<T>.Instantiate(this);
|
||||
_runners.Add(type, result);
|
||||
return (T)result;
|
||||
}
|
||||
|
||||
internal void OnRunnerDestroy(IEcsRunner runner)
|
||||
{
|
||||
_runners.Remove(runner.Interface);
|
||||
|
@ -54,9 +54,9 @@ namespace DCFApixels.DragonECS
|
||||
{
|
||||
public interface IEcsRunner
|
||||
{
|
||||
EcsPipeline Source { get; }
|
||||
EcsPipeline Pipeline { get; }
|
||||
Type Interface { get; }
|
||||
IList Targets { get; }
|
||||
IList TargetsRaw { get; }
|
||||
object Filter { get; }
|
||||
bool IsHasFilter { get; }
|
||||
bool IsDestroyed { get; }
|
||||
@ -203,9 +203,10 @@ namespace DCFApixels.DragonECS
|
||||
private bool _isDestroyed;
|
||||
|
||||
#region Properties
|
||||
public EcsPipeline Source => _source;
|
||||
public EcsPipeline Pipeline => _source;
|
||||
public Type Interface => typeof(TInterface);
|
||||
public IList Targets => _targetsSealed;
|
||||
public IList TargetsRaw => _targetsSealed;
|
||||
public ReadOnlySpan<TInterface> Targets => targets;
|
||||
public object Filter => _filter;
|
||||
public bool IsHasFilter => _isHasFilter;
|
||||
public bool IsDestroyed => _isDestroyed;
|
||||
@ -225,9 +226,13 @@ namespace DCFApixels.DragonECS
|
||||
internal void Rebuild()
|
||||
{
|
||||
if (_isHasFilter)
|
||||
{
|
||||
Set(_source, FilterSystems(_source.AllSystems), _isHasFilter, _filter);
|
||||
}
|
||||
else
|
||||
{
|
||||
Set(_source, FilterSystems(_source.AllSystems, _filter), _isHasFilter, _filter);
|
||||
}
|
||||
}
|
||||
public void Destroy()
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user