update inject system

This commit is contained in:
Mikhail 2024-02-17 00:10:38 +08:00
parent b6a65d403b
commit 60c103a26f
2 changed files with 62 additions and 40 deletions

View File

@ -1,7 +1,6 @@
using DCFApixels.DragonECS.Internal;
using DCFApixels.DragonECS.RunnersCore;
using System;
using System.Linq;
namespace DCFApixels.DragonECS
{
@ -44,17 +43,20 @@ namespace DCFApixels.DragonECS
namespace Internal
{
internal class PreInitInjectController
internal class InitInjectController
{
private EcsPipeline _source;
private InjectSystemBase[] _injectSystems;
private InitInjectSystemBase[] _injectSystems;
private int _injectCount;
public bool IsInjectionEnd => _injectCount >= _injectSystems.Length;
public PreInitInjectController(EcsPipeline source)
public bool IsInjectionEnd
{
get { return _injectCount >= _injectSystems.Length; }
}
public InitInjectController(EcsPipeline source)
{
_injectCount = 0;
_source = source;
_injectSystems = _source.AllSystems.OfType<InjectSystemBase>().ToArray();
_injectSystems = _source.GetSystems<InitInjectSystemBase>();
}
public bool OnInject()
{
@ -133,33 +135,35 @@ namespace DCFApixels.DragonECS
foreach (var item in targets) item.OnPreInitInjectionBefore();
}
}
public abstract class InjectSystemBase { }
public abstract class InitInjectSystemBase { }
[MetaTags(MetaTags.HIDDEN)]
[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;
void IEcsInject<EcsPipeline>.Inject(EcsPipeline obj) => _pipeline = obj;
private PreInitInjectController _injectController;
void IEcsInject<PreInitInjectController>.Inject(PreInitInjectController obj) => _injectController = obj;
private T _injectedData;
public InjectSystem(T injectedData)
public EcsPipeline Pipeline
{
if (injectedData == null) Throw.ArgumentNull();
_injectedData = injectedData;
get { return Pipeline; }
set
{
_pipeline = value;
if (_injectedData == null)
{
return;
}
public void PreInit()
{
if (_injectedData == null) return;
if (_injectController == null)
{
_injectController = new PreInitInjectController(_pipeline);
var injectMapRunner = _pipeline.GetRunner<IEcsInject<PreInitInjectController>>();
var injectPipelineRunner = _pipeline.GetRunner<IEcsInject<EcsPipeline>>();
injectPipelineRunner.Inject(_pipeline);
EcsRunner.Destroy(injectPipelineRunner);
_injectController = new InitInjectController(_pipeline);
var injectMapRunner = _pipeline.GetRunner<IEcsInject<InitInjectController>>();
_pipeline.GetRunner<IEcsPreInitInjectProcess>().OnPreInitInjectionBefore();
injectMapRunner.Inject(_injectController);
EcsRunner.Destroy(injectMapRunner);
}
var injectRunnerGeneric = _pipeline.GetRunner<IEcsInject<T>>();
injectRunnerGeneric.Inject(_injectedData);
@ -172,8 +176,19 @@ namespace DCFApixels.DragonECS
}
_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)
{
if (data == null) Throw.ArgumentNull();
self.Add(new InjectSystem<T>(data));
self.Add(new InitInjectSystem<T>(data));
if (data is IEcsModule module)
self.AddModule(module);
return self;

View File

@ -9,6 +9,10 @@ using System.Runtime.CompilerServices;
namespace DCFApixels.DragonECS
{
public interface IEcsPipelineMember
{
public EcsPipeline Pipeline { get; set; }
}
public sealed class EcsPipeline
{
private IEcsProcess[] _allSystems;
@ -87,9 +91,12 @@ namespace DCFApixels.DragonECS
return;
}
var ecsPipelineInjectRunner = GetRunner<IEcsInject<EcsPipeline>>();
ecsPipelineInjectRunner.Inject(this);
EcsRunner.Destroy(ecsPipelineInjectRunner);
IEcsPipelineMember[] members = GetSystems<IEcsPipelineMember>();
foreach (var member in members)
{
member.Pipeline = this;
}
var preInitRunner = GetRunner<IEcsPreInitProcess>();
preInitRunner.PreInit();
EcsRunner.Destroy(preInitRunner);