Update InjectSystem.cs

This commit is contained in:
Mikhail 2023-03-29 15:48:37 +08:00
parent 3787f2fc38
commit 7dd9f6bc5e

View File

@ -1,19 +1,17 @@
using System.Collections.Generic; using DCFApixels.DragonECS.Internal;
using DCFApixels.DragonECS.Internal;
using System.Linq; using System.Linq;
namespace DCFApixels.DragonECS namespace DCFApixels.DragonECS
{ {
namespace Internal namespace Internal
{ {
internal class InjectController internal class PreInitInjectController
{ {
private EcsSystems _source; private EcsSystems _source;
private InjectSystemBase[] _injectSystems; private InjectSystemBase[] _injectSystems;
private int _injectCount; private int _injectCount;
public InjectController(EcsSystems source) public PreInitInjectController(EcsSystems source)
{ {
_injectCount = 0; _injectCount = 0;
_source = source; _source = source;
@ -36,17 +34,16 @@ namespace DCFApixels.DragonECS
} }
} }
public interface IEcsPreInject : IEcsSystem
public interface IEcsInject : IEcsSystem
{ {
public void Inject(object obj); public void PreInject(object obj);
} }
[DebugColor(DebugColor.Gray)] [DebugHide, DebugColor(DebugColor.Gray)]
public sealed class InjectRunner : EcsRunner<IEcsInject>, IEcsInject public sealed class PreInjectRunner : EcsRunner<IEcsPreInject>, IEcsPreInject
{ {
void IEcsInject.Inject(object obj) void IEcsPreInject.PreInject(object obj)
{ {
foreach (var item in targets) item.Inject(obj); foreach (var item in targets) item.PreInject(obj);
} }
} }
@ -54,54 +51,51 @@ namespace DCFApixels.DragonECS
{ {
public void Inject(T obj); public void Inject(T obj);
} }
[DebugColor(DebugColor.Gray)]
[DebugHide, DebugColor(DebugColor.Gray)]
public sealed class InjectRunner<T> : EcsRunner<IEcsInject<T>>, IEcsInject<T> public sealed class InjectRunner<T> : EcsRunner<IEcsInject<T>>, IEcsInject<T>
{ {
private IEcsPreInject _preInjectchache;
void IEcsInject<T>.Inject(T obj) void IEcsInject<T>.Inject(T obj)
{ {
_preInjectchache.PreInject(obj);
foreach (var item in targets) item.Inject(obj); foreach (var item in targets) item.Inject(obj);
} }
}
public interface IEcsInjectCallbacks : IEcsSystem protected override void OnSetup()
{ {
public void OnInjectionBefore(); _preInjectchache = Source.GetRunner<IEcsPreInject>();
public void OnInjectionAfter();
}
[DebugColor(DebugColor.Gray)]
public sealed class InjectCallbacksRunner : EcsRunner<IEcsInjectCallbacks>, IEcsInjectCallbacks
{
public void OnInjectionAfter()
{
foreach (var item in targets) item.OnInjectionAfter();
}
public void OnInjectionBefore()
{
foreach (var item in targets) item.OnInjectionBefore();
} }
} }
public class InjectSystemBase public interface IEcsPreInitInjectCallbacks : IEcsSystem
{ {
private static int _injectSystemID = EcsDebug.RegisterMark("InjectSystem"); public void OnPreInitInjectionBefore();
public void OnPreInitInjectionAfter();
protected static void ProfileMarkerBegin()
{
EcsDebug.ProfileMarkBegin(_injectSystemID);
} }
protected static void ProfileMarkerEnd()
[DebugHide, DebugColor(DebugColor.Gray)]
public sealed class InjectCallbacksRunner : EcsRunner<IEcsPreInitInjectCallbacks>, IEcsPreInitInjectCallbacks
{ {
EcsDebug.ProfileMarkEnd(_injectSystemID); public void OnPreInitInjectionAfter()
{
foreach (var item in targets) item.OnPreInitInjectionAfter();
}
public void OnPreInitInjectionBefore()
{
foreach (var item in targets) item.OnPreInitInjectionBefore();
} }
} }
[DebugColor(DebugColor.Gray)] public class InjectSystemBase { }
public class InjectSystem<T> : InjectSystemBase, IEcsPreInitSystem, IEcsInject<InjectController>, IEcsInjectCallbacks
[DebugHide, DebugColor(DebugColor.Gray)]
public class InjectSystem<T> : InjectSystemBase, IEcsPreInitSystem, IEcsInject<PreInitInjectController>, IEcsPreInitInjectCallbacks
{ {
private T _injectedData; private T _injectedData;
private InjectController _injectController; private PreInitInjectController _injectController;
void IEcsInject<InjectController>.Inject(InjectController obj) => _injectController = obj; void IEcsInject<PreInitInjectController>.Inject(PreInitInjectController obj) => _injectController = obj;
public InjectSystem(T injectedData) public InjectSystem(T injectedData)
{ {
@ -110,33 +104,29 @@ namespace DCFApixels.DragonECS
public void PreInit(EcsSystems systems) public void PreInit(EcsSystems systems)
{ {
if (_injectController == null) if (_injectController == null)
{ {
ProfileMarkerBegin(); _injectController = new PreInitInjectController(systems);
var injectMapRunner = systems.GetRunner<IEcsInject<PreInitInjectController>>();
_injectController = new InjectController(systems); systems.GetRunner<IEcsPreInitInjectCallbacks>().OnPreInitInjectionBefore();
var injectMapRunner = systems.GetRunner<IEcsInject<InjectController>>();
systems.GetRunner<IEcsInjectCallbacks>().OnInjectionBefore();
injectMapRunner.Inject(_injectController); injectMapRunner.Inject(_injectController);
} }
var injectRunnerGeneric = systems.GetRunner<IEcsInject<T>>(); var injectRunnerGeneric = systems.GetRunner<IEcsInject<T>>();
var injectRunner = systems.GetRunner<IEcsInject>();
injectRunnerGeneric.Inject(_injectedData); injectRunnerGeneric.Inject(_injectedData);
injectRunner.Inject(_injectedData);
if (_injectController.OnInject()) if (_injectController.OnInject())
{ {
_injectController.Destroy(); _injectController.Destroy();
var injectCallbacksRunner = systems.GetRunner<IEcsInjectCallbacks>(); var injectCallbacksRunner = systems.GetRunner<IEcsPreInitInjectCallbacks>();
injectCallbacksRunner.OnInjectionAfter(); injectCallbacksRunner.OnPreInitInjectionAfter();
ProfileMarkerEnd();
} }
} }
public void OnInjectionBefore() { } public void OnPreInitInjectionBefore() { }
public void OnInjectionAfter() public void OnPreInitInjectionAfter()
{ {
_injectController = null; _injectController = null;
} }