This commit is contained in:
DCFApixels 2025-07-12 01:28:24 +08:00
parent ab50dcb7e3
commit b3571e3ed8
3 changed files with 49 additions and 16 deletions

View File

@ -37,13 +37,51 @@ namespace DCFApixels.DragonECS
private readonly List<InitDeclaredRunner> _initDeclaredRunners = new List<InitDeclaredRunner>(4); private readonly List<InitDeclaredRunner> _initDeclaredRunners = new List<InitDeclaredRunner>(4);
public readonly LayersMap Layers; public readonly LayersMap Layers;
public readonly Injector.Builder Injector; public readonly InitInjector Injector;
public readonly Configurator Configs; public readonly Configurator Configs;
private AddParams _defaultAddParams = new AddParams(BASIC_LAYER, 0, false); private AddParams _defaultAddParams = new AddParams(BASIC_LAYER, 0, false);
private HashSet<Type> _uniqueSystemsSet = new HashSet<Type>(); private HashSet<Type> _uniqueSystemsSet = new HashSet<Type>();
#region InitInjector
public readonly struct InitInjector
{
public readonly Injector.Builder Instance;
public readonly Builder PipelineBuilder;
public InitInjector(Injector.Builder instance, Builder pipelineBuilder)
{
Instance = instance;
PipelineBuilder = pipelineBuilder;
}
public Builder AddNode<T>()
{
Instance.AddNode<T>();
return PipelineBuilder;
}
public Builder Inject<T>(T obj)
{
Instance.Inject(obj);
return PipelineBuilder;
}
public Builder Extract<T>(ref T obj)
{
Instance.Extract(ref obj);
return PipelineBuilder;
}
public Builder Add(Injector.Builder other)
{
Instance.Add(other);
return PipelineBuilder;
}
public Injector Build(EcsPipeline pipeline)
{
return Instance.Build(pipeline);
}
}
#endregion
#region Properties #region Properties
//private ReadOnlySpan<SystemNode> SystemRecords //private ReadOnlySpan<SystemNode> SystemRecords
//{ //{
@ -57,7 +95,8 @@ namespace DCFApixels.DragonECS
if (config == null) { config = new ConfigContainer(); } if (config == null) { config = new ConfigContainer(); }
Configs = new Configurator(config, this); Configs = new Configurator(config, this);
Injector = new Injector.Builder(this); var injectorBuilder = new Injector.Builder();
Injector = new InitInjector(injectorBuilder, this);
Injector.AddNode<object>(); Injector.AddNode<object>();
Injector.AddNode<EcsWorld>(); Injector.AddNode<EcsWorld>();
Injector.AddNode<EcsAspect>(); Injector.AddNode<EcsAspect>();
@ -368,7 +407,7 @@ namespace DCFApixels.DragonECS
} }
} }
EcsPipeline pipeline = new EcsPipeline(allSystems, Configs.Instance.GetContainer(), Injector); EcsPipeline pipeline = new EcsPipeline(allSystems, Configs.Instance.GetContainer(), Injector.Instance);
foreach (var item in _initDeclaredRunners) foreach (var item in _initDeclaredRunners)
{ {
item.Declare(pipeline); item.Declare(pipeline);

View File

@ -90,7 +90,7 @@ namespace DCFApixels.DragonECS
} }
if(injectorBuilder == null) if(injectorBuilder == null)
{ {
injectorBuilder = new Injector.Builder(null); injectorBuilder = new Injector.Builder();
} }
_configs = configs; _configs = configs;

View File

@ -176,21 +176,18 @@ namespace DCFApixels.DragonECS
public class Builder : IInjector public class Builder : IInjector
{ {
private EcsPipeline.Builder _source;
private Injector _instance; private Injector _instance;
private List<InitInjectBase> _initInjections = new List<InitInjectBase>(32); private List<InitInjectBase> _initInjections = new List<InitInjectBase>(32);
private EcsWorld _monoWorld; private EcsWorld _monoWorld;
internal Builder(EcsPipeline.Builder source) internal Builder()
{ {
_source = source;
_instance = new Injector(); _instance = new Injector();
} }
public EcsPipeline.Builder AddNode<T>() public void AddNode<T>()
{ {
_instance.TryDeclare<T>(); _instance.TryDeclare<T>();
return _source;
} }
public EcsPipeline.Builder Inject<T>(T obj) public void Inject<T>(T obj)
{ {
if (obj is EcsWorld objWorld) if (obj is EcsWorld objWorld)
{ {
@ -217,9 +214,8 @@ namespace DCFApixels.DragonECS
} }
} }
_initInjections.Add(new InitInject<T>(obj)); _initInjections.Add(new InitInject<T>(obj));
return _source;
} }
public EcsPipeline.Builder Extract<T>(ref T obj) // TODO проверить public void Extract<T>(ref T obj) // TODO проверить
{ {
Type type = typeof(T); Type type = typeof(T);
for (int i = _initInjections.Count - 1; i >= 0; i--) for (int i = _initInjections.Count - 1; i >= 0; i--)
@ -228,11 +224,10 @@ namespace DCFApixels.DragonECS
if (type.IsAssignableFrom(item.Type)) if (type.IsAssignableFrom(item.Type))
{ {
obj = (T)item.Raw; obj = (T)item.Raw;
return _source; return;
} }
} }
Throw.UndefinedException(); Throw.UndefinedException();
return default;
} }
public Injector Build(EcsPipeline pipeline) public Injector Build(EcsPipeline pipeline)
{ {
@ -242,7 +237,6 @@ namespace DCFApixels.DragonECS
monoWorldSystem.World = _monoWorld; monoWorldSystem.World = _monoWorld;
} }
var initInjectionCallbacks = pipeline.GetProcess<IOnInitInjectionComplete>(); var initInjectionCallbacks = pipeline.GetProcess<IOnInitInjectionComplete>();
foreach (var system in initInjectionCallbacks) foreach (var system in initInjectionCallbacks)
{ {
@ -292,7 +286,7 @@ namespace DCFApixels.DragonECS
} }
public override void InjectTo(Injector instance) public override void InjectTo(Injector instance)
{ {
instance.Inject<T>(_injectedData); instance.Inject(_injectedData);
} }
} }
} }