mirror of
https://github.com/DCFApixels/DragonECS.git
synced 2025-09-18 18:14:37 +08:00
update inject system
This commit is contained in:
parent
b6a65d403b
commit
60c103a26f
@ -1,7 +1,6 @@
|
|||||||
using DCFApixels.DragonECS.Internal;
|
using DCFApixels.DragonECS.Internal;
|
||||||
using DCFApixels.DragonECS.RunnersCore;
|
using DCFApixels.DragonECS.RunnersCore;
|
||||||
using System;
|
using System;
|
||||||
using System.Linq;
|
|
||||||
|
|
||||||
namespace DCFApixels.DragonECS
|
namespace DCFApixels.DragonECS
|
||||||
{
|
{
|
||||||
@ -44,17 +43,20 @@ namespace DCFApixels.DragonECS
|
|||||||
|
|
||||||
namespace Internal
|
namespace Internal
|
||||||
{
|
{
|
||||||
internal class PreInitInjectController
|
internal class InitInjectController
|
||||||
{
|
{
|
||||||
private EcsPipeline _source;
|
private EcsPipeline _source;
|
||||||
private InjectSystemBase[] _injectSystems;
|
private InitInjectSystemBase[] _injectSystems;
|
||||||
private int _injectCount;
|
private int _injectCount;
|
||||||
public bool IsInjectionEnd => _injectCount >= _injectSystems.Length;
|
public bool IsInjectionEnd
|
||||||
public PreInitInjectController(EcsPipeline source)
|
{
|
||||||
|
get { return _injectCount >= _injectSystems.Length; }
|
||||||
|
}
|
||||||
|
public InitInjectController(EcsPipeline source)
|
||||||
{
|
{
|
||||||
_injectCount = 0;
|
_injectCount = 0;
|
||||||
_source = source;
|
_source = source;
|
||||||
_injectSystems = _source.AllSystems.OfType<InjectSystemBase>().ToArray();
|
_injectSystems = _source.GetSystems<InitInjectSystemBase>();
|
||||||
}
|
}
|
||||||
public bool OnInject()
|
public bool OnInject()
|
||||||
{
|
{
|
||||||
@ -133,33 +135,35 @@ namespace DCFApixels.DragonECS
|
|||||||
foreach (var item in targets) item.OnPreInitInjectionBefore();
|
foreach (var item in targets) item.OnPreInitInjectionBefore();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public abstract class InjectSystemBase { }
|
public abstract class InitInjectSystemBase { }
|
||||||
|
|
||||||
[MetaTags(MetaTags.HIDDEN)]
|
[MetaTags(MetaTags.HIDDEN)]
|
||||||
[MetaColor(MetaColor.Gray)]
|
[MetaColor(MetaColor.Gray)]
|
||||||
public class InjectSystem<T> : InjectSystemBase, IEcsInject<EcsPipeline>, IEcsPreInitProcess, IEcsInject<PreInitInjectController>, IEcsPreInitInjectProcess
|
public class InitInjectSystem<T> : InitInjectSystemBase, IEcsPipelineMember, IEcsInject<InitInjectController>, IEcsPreInitInjectProcess
|
||||||
{
|
{
|
||||||
private EcsPipeline _pipeline;
|
private EcsPipeline _pipeline;
|
||||||
void IEcsInject<EcsPipeline>.Inject(EcsPipeline obj) => _pipeline = obj;
|
public EcsPipeline Pipeline
|
||||||
private PreInitInjectController _injectController;
|
|
||||||
void IEcsInject<PreInitInjectController>.Inject(PreInitInjectController obj) => _injectController = obj;
|
|
||||||
|
|
||||||
private T _injectedData;
|
|
||||||
|
|
||||||
public InjectSystem(T injectedData)
|
|
||||||
{
|
{
|
||||||
if (injectedData == null) Throw.ArgumentNull();
|
get { return Pipeline; }
|
||||||
_injectedData = injectedData;
|
set
|
||||||
|
{
|
||||||
|
_pipeline = value;
|
||||||
|
|
||||||
|
if (_injectedData == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
public void PreInit()
|
|
||||||
{
|
|
||||||
if (_injectedData == null) return;
|
|
||||||
if (_injectController == null)
|
if (_injectController == null)
|
||||||
{
|
{
|
||||||
_injectController = new PreInitInjectController(_pipeline);
|
var injectPipelineRunner = _pipeline.GetRunner<IEcsInject<EcsPipeline>>();
|
||||||
var injectMapRunner = _pipeline.GetRunner<IEcsInject<PreInitInjectController>>();
|
injectPipelineRunner.Inject(_pipeline);
|
||||||
|
EcsRunner.Destroy(injectPipelineRunner);
|
||||||
|
|
||||||
|
_injectController = new InitInjectController(_pipeline);
|
||||||
|
var injectMapRunner = _pipeline.GetRunner<IEcsInject<InitInjectController>>();
|
||||||
_pipeline.GetRunner<IEcsPreInitInjectProcess>().OnPreInitInjectionBefore();
|
_pipeline.GetRunner<IEcsPreInitInjectProcess>().OnPreInitInjectionBefore();
|
||||||
injectMapRunner.Inject(_injectController);
|
injectMapRunner.Inject(_injectController);
|
||||||
|
EcsRunner.Destroy(injectMapRunner);
|
||||||
}
|
}
|
||||||
var injectRunnerGeneric = _pipeline.GetRunner<IEcsInject<T>>();
|
var injectRunnerGeneric = _pipeline.GetRunner<IEcsInject<T>>();
|
||||||
injectRunnerGeneric.Inject(_injectedData);
|
injectRunnerGeneric.Inject(_injectedData);
|
||||||
@ -172,8 +176,19 @@ namespace DCFApixels.DragonECS
|
|||||||
}
|
}
|
||||||
_injectedData = default;
|
_injectedData = default;
|
||||||
}
|
}
|
||||||
public void OnPreInitInjectionBefore() { }
|
}
|
||||||
public void OnPreInitInjectionAfter() => _injectController = null;
|
|
||||||
|
private InitInjectController _injectController;
|
||||||
|
void IEcsInject<InitInjectController>.Inject(InitInjectController obj) { _injectController = obj; }
|
||||||
|
|
||||||
|
private T _injectedData;
|
||||||
|
internal InitInjectSystem(T injectedData)
|
||||||
|
{
|
||||||
|
if (injectedData == null) Throw.ArgumentNull();
|
||||||
|
_injectedData = injectedData;
|
||||||
|
}
|
||||||
|
void IEcsPreInitInjectProcess.OnPreInitInjectionBefore() { }
|
||||||
|
void IEcsPreInitInjectProcess.OnPreInitInjectionAfter() { _injectController = null; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -189,7 +204,7 @@ namespace DCFApixels.DragonECS
|
|||||||
public static EcsPipeline.Builder Inject<T>(this EcsPipeline.Builder self, T data)
|
public static EcsPipeline.Builder Inject<T>(this EcsPipeline.Builder self, T data)
|
||||||
{
|
{
|
||||||
if (data == null) Throw.ArgumentNull();
|
if (data == null) Throw.ArgumentNull();
|
||||||
self.Add(new InjectSystem<T>(data));
|
self.Add(new InitInjectSystem<T>(data));
|
||||||
if (data is IEcsModule module)
|
if (data is IEcsModule module)
|
||||||
self.AddModule(module);
|
self.AddModule(module);
|
||||||
return self;
|
return self;
|
||||||
|
@ -9,6 +9,10 @@ using System.Runtime.CompilerServices;
|
|||||||
|
|
||||||
namespace DCFApixels.DragonECS
|
namespace DCFApixels.DragonECS
|
||||||
{
|
{
|
||||||
|
public interface IEcsPipelineMember
|
||||||
|
{
|
||||||
|
public EcsPipeline Pipeline { get; set; }
|
||||||
|
}
|
||||||
public sealed class EcsPipeline
|
public sealed class EcsPipeline
|
||||||
{
|
{
|
||||||
private IEcsProcess[] _allSystems;
|
private IEcsProcess[] _allSystems;
|
||||||
@ -87,9 +91,12 @@ namespace DCFApixels.DragonECS
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var ecsPipelineInjectRunner = GetRunner<IEcsInject<EcsPipeline>>();
|
IEcsPipelineMember[] members = GetSystems<IEcsPipelineMember>();
|
||||||
ecsPipelineInjectRunner.Inject(this);
|
foreach (var member in members)
|
||||||
EcsRunner.Destroy(ecsPipelineInjectRunner);
|
{
|
||||||
|
member.Pipeline = this;
|
||||||
|
}
|
||||||
|
|
||||||
var preInitRunner = GetRunner<IEcsPreInitProcess>();
|
var preInitRunner = GetRunner<IEcsPreInitProcess>();
|
||||||
preInitRunner.PreInit();
|
preInitRunner.PreInit();
|
||||||
EcsRunner.Destroy(preInitRunner);
|
EcsRunner.Destroy(preInitRunner);
|
||||||
|
Loading…
Reference in New Issue
Block a user