mirror of
https://github.com/DCFApixels/DragonECS.git
synced 2025-09-18 09:54:35 +08:00
Update InjectSystem.cs
This commit is contained in:
parent
3787f2fc38
commit
7dd9f6bc5e
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected override void OnSetup()
|
||||||
|
{
|
||||||
|
_preInjectchache = Source.GetRunner<IEcsPreInject>();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public interface IEcsInjectCallbacks : IEcsSystem
|
public interface IEcsPreInitInjectCallbacks : IEcsSystem
|
||||||
{
|
{
|
||||||
public void OnInjectionBefore();
|
public void OnPreInitInjectionBefore();
|
||||||
public void OnInjectionAfter();
|
public void OnPreInitInjectionAfter();
|
||||||
}
|
}
|
||||||
[DebugColor(DebugColor.Gray)]
|
|
||||||
public sealed class InjectCallbacksRunner : EcsRunner<IEcsInjectCallbacks>, IEcsInjectCallbacks
|
[DebugHide, DebugColor(DebugColor.Gray)]
|
||||||
|
public sealed class InjectCallbacksRunner : EcsRunner<IEcsPreInitInjectCallbacks>, IEcsPreInitInjectCallbacks
|
||||||
{
|
{
|
||||||
public void OnInjectionAfter()
|
public void OnPreInitInjectionAfter()
|
||||||
{
|
{
|
||||||
foreach (var item in targets) item.OnInjectionAfter();
|
foreach (var item in targets) item.OnPreInitInjectionAfter();
|
||||||
}
|
}
|
||||||
public void OnInjectionBefore()
|
public void OnPreInitInjectionBefore()
|
||||||
{
|
{
|
||||||
foreach (var item in targets) item.OnInjectionBefore();
|
foreach (var item in targets) item.OnPreInitInjectionBefore();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class InjectSystemBase
|
public class InjectSystemBase { }
|
||||||
{
|
|
||||||
private static int _injectSystemID = EcsDebug.RegisterMark("InjectSystem");
|
|
||||||
|
|
||||||
protected static void ProfileMarkerBegin()
|
[DebugHide, DebugColor(DebugColor.Gray)]
|
||||||
{
|
public class InjectSystem<T> : InjectSystemBase, IEcsPreInitSystem, IEcsInject<PreInitInjectController>, IEcsPreInitInjectCallbacks
|
||||||
EcsDebug.ProfileMarkBegin(_injectSystemID);
|
|
||||||
}
|
|
||||||
protected static void ProfileMarkerEnd()
|
|
||||||
{
|
|
||||||
EcsDebug.ProfileMarkEnd(_injectSystemID);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
[DebugColor(DebugColor.Gray)]
|
|
||||||
public class InjectSystem<T> : InjectSystemBase, IEcsPreInitSystem, IEcsInject<InjectController>, IEcsInjectCallbacks
|
|
||||||
{
|
{
|
||||||
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)
|
|
||||||
{
|
|
||||||
ProfileMarkerBegin();
|
|
||||||
|
|
||||||
_injectController = new InjectController(systems);
|
if (_injectController == null)
|
||||||
var injectMapRunner = systems.GetRunner<IEcsInject<InjectController>>();
|
{
|
||||||
systems.GetRunner<IEcsInjectCallbacks>().OnInjectionBefore();
|
_injectController = new PreInitInjectController(systems);
|
||||||
|
var injectMapRunner = systems.GetRunner<IEcsInject<PreInitInjectController>>();
|
||||||
|
systems.GetRunner<IEcsPreInitInjectCallbacks>().OnPreInitInjectionBefore();
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user