mirror of
https://github.com/DCFApixels/DragonECS-AutoInjections.git
synced 2025-09-18 05:04:35 +08:00
fixes
This commit is contained in:
parent
a890e1d184
commit
92697989e1
@ -37,7 +37,9 @@ namespace DCFApixels.DragonECS
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
foreach (var item in _systemProoperties.Keys)
|
foreach (var item in _systemProoperties.Keys)
|
||||||
|
{
|
||||||
_notInjected.Add(item);
|
_notInjected.Add(item);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void Do(Type type, List<IInjectedProperty> result)
|
private static void Do(Type type, List<IInjectedProperty> result)
|
||||||
@ -139,10 +141,10 @@ namespace DCFApixels.DragonECS
|
|||||||
|
|
||||||
private readonly struct InjectedPropertyRecord
|
private readonly struct InjectedPropertyRecord
|
||||||
{
|
{
|
||||||
public readonly IEcsProcess target;
|
public readonly IEcsSystem target;
|
||||||
public readonly IInjectedProperty property;
|
public readonly IInjectedProperty property;
|
||||||
public EcsInjectAttribute Attribute => property.GetAutoInjectAttribute();
|
public EcsInjectAttribute Attribute => property.GetAutoInjectAttribute();
|
||||||
public InjectedPropertyRecord(IEcsProcess target, IInjectedProperty property)
|
public InjectedPropertyRecord(IEcsSystem target, IInjectedProperty property)
|
||||||
{
|
{
|
||||||
this.target = target;
|
this.target = target;
|
||||||
this.property = property;
|
this.property = property;
|
||||||
@ -152,28 +154,38 @@ namespace DCFApixels.DragonECS
|
|||||||
|
|
||||||
[MetaTags(MetaTags.HIDDEN)]
|
[MetaTags(MetaTags.HIDDEN)]
|
||||||
[MetaColor(MetaColor.Gray)]
|
[MetaColor(MetaColor.Gray)]
|
||||||
public class AutoInjectSystem : IEcsPreInject, IEcsInject<EcsPipeline>, IEcsPreInitInjectProcess
|
public class AutoInjectSystem : IEcsInject<object>, IEcsPipelineMember, IEcsPreInitInjectProcess
|
||||||
{
|
{
|
||||||
private EcsPipeline _pipeline;
|
private EcsPipeline _pipeline;
|
||||||
|
EcsPipeline IEcsPipelineMember.Pipeline { get => _pipeline; set => _pipeline = value; }
|
||||||
private List<object> _delayedInjects = new List<object>();
|
private List<object> _delayedInjects = new List<object>();
|
||||||
private AutoInjectionMap _autoInjectionMap;
|
private AutoInjectionMap _autoInjectionMap;
|
||||||
private bool _preInitInjectCompleted = false;
|
private bool _preInitInjectCompleted = false;
|
||||||
public void Inject(EcsPipeline obj) => _pipeline = obj;
|
|
||||||
public void PreInject(object obj)
|
public void Inject(object obj)
|
||||||
{
|
{
|
||||||
if (!_preInitInjectCompleted)
|
if (!_preInitInjectCompleted)
|
||||||
|
{
|
||||||
_delayedInjects.Add(obj);
|
_delayedInjects.Add(obj);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
_autoInjectionMap.Inject(obj.GetType(), obj);
|
_autoInjectionMap.Inject(obj.GetType(), obj);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public void OnPreInitInjectionBefore(EcsPipeline pipeline)
|
||||||
|
{
|
||||||
|
_pipeline = pipeline;
|
||||||
}
|
}
|
||||||
public void OnPreInitInjectionBefore() { }
|
|
||||||
public void OnPreInitInjectionAfter()
|
public void OnPreInitInjectionAfter()
|
||||||
{
|
{
|
||||||
_autoInjectionMap = new AutoInjectionMap(_pipeline);
|
_autoInjectionMap = new AutoInjectionMap(_pipeline);
|
||||||
_preInitInjectCompleted = true;
|
_preInitInjectCompleted = true;
|
||||||
|
|
||||||
foreach (var obj in _delayedInjects)
|
foreach (var obj in _delayedInjects)
|
||||||
|
{
|
||||||
_autoInjectionMap.Inject(obj.GetType(), obj);
|
_autoInjectionMap.Inject(obj.GetType(), obj);
|
||||||
|
}
|
||||||
_autoInjectionMap.InjectDummy();
|
_autoInjectionMap.InjectDummy();
|
||||||
_autoInjectionMap.OnPreInitInjectionComplete();
|
_autoInjectionMap.OnPreInitInjectionComplete();
|
||||||
|
|
||||||
|
@ -1,179 +0,0 @@
|
|||||||
//using System;
|
|
||||||
//using System.Collections.Generic;
|
|
||||||
//using System.Reflection;
|
|
||||||
//using System.Runtime.CompilerServices;
|
|
||||||
//
|
|
||||||
//namespace DCFApixels.DragonECS
|
|
||||||
//{
|
|
||||||
// public static class AutoProcesses
|
|
||||||
// {
|
|
||||||
// private static Dictionary<string, BuilderHandler> _builders;
|
|
||||||
// [MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|
||||||
// private static bool TryGetCustomAttribute<T>(Type self, out T attribute) where T : Attribute
|
|
||||||
// {
|
|
||||||
// attribute = self.GetCustomAttribute<T>();
|
|
||||||
// return attribute != null;
|
|
||||||
// }
|
|
||||||
// static AutoProcesses()
|
|
||||||
// {
|
|
||||||
// _builders = new Dictionary<string, BuilderHandler>();
|
|
||||||
// foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
|
|
||||||
// {
|
|
||||||
// var types = assembly.GetTypes();
|
|
||||||
// foreach (var type in types)
|
|
||||||
// {
|
|
||||||
// if (type.IsGenericType)
|
|
||||||
// continue;
|
|
||||||
// if (TryGetCustomAttribute(type, out EcsProcessWrapperBuilderAttribute attr))
|
|
||||||
// {
|
|
||||||
// MethodInfo method = type.GetMethod(attr.wrapperBuilderMethodName, BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);
|
|
||||||
// BuilderHandler action = (BuilderHandler)Delegate.CreateDelegate(typeof(BuilderHandler), null, method);
|
|
||||||
// _builders.Add(attr.processMethodName, action);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// public static EcsPipeline.Builder AddAuto(this EcsPipeline.Builder self, object system, string layerName = null)
|
|
||||||
// {
|
|
||||||
// var methods = system.GetType().GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
|
|
||||||
// foreach (var method in methods)
|
|
||||||
// {
|
|
||||||
// if (_builders.TryGetValue(method.Name, out var builder))
|
|
||||||
// {
|
|
||||||
// var process = builder(system, method);
|
|
||||||
// if (process != null)
|
|
||||||
// self.Add(process, layerName);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// if (system is IEcsProcess systemInterface)
|
|
||||||
// self.Add(systemInterface, layerName);
|
|
||||||
// return self;
|
|
||||||
// }
|
|
||||||
// private delegate IEcsProcess BuilderHandler(object targete, MethodInfo method);
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Interface, Inherited = false, AllowMultiple = false)]
|
|
||||||
// sealed class EcsProcessWrapperBuilderAttribute : Attribute
|
|
||||||
// {
|
|
||||||
// public readonly string processMethodName;
|
|
||||||
// public readonly string wrapperBuilderMethodName;
|
|
||||||
// public EcsProcessWrapperBuilderAttribute(string processMethodName, string wrapperBuilderMethodName = "Builder")
|
|
||||||
// {
|
|
||||||
// this.processMethodName = processMethodName;
|
|
||||||
// this.wrapperBuilderMethodName = wrapperBuilderMethodName;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// public static class EcsAutoProcessUtility
|
|
||||||
// {
|
|
||||||
// public static TDelegate CreateDelegate<TDelegate>(object system, MethodInfo method) where TDelegate : Delegate
|
|
||||||
// {
|
|
||||||
// return (TDelegate)Delegate.CreateDelegate(typeof(TDelegate), system, method);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
||||||
// internal class EcsProcessWrapperBase
|
|
||||||
// {
|
|
||||||
// [MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|
||||||
// public static bool CheckParameters(MethodInfo method)
|
|
||||||
// {
|
|
||||||
// return method.GetParameters().Length <= 0;
|
|
||||||
// }
|
|
||||||
// [MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|
||||||
// public static Action CreateAction(object target, MethodInfo method)
|
|
||||||
// {
|
|
||||||
// return EcsAutoProcessUtility.CreateDelegate<Action>(target, method);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// internal class IEcsProcessWrapper : EcsProcessWrapperBase, IEcsMetaProvider
|
|
||||||
// {
|
|
||||||
// public object system;
|
|
||||||
// public Action a;
|
|
||||||
// public object MetaSource => system;
|
|
||||||
// }
|
|
||||||
// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
||||||
// [EcsProcessWrapperBuilder(nameof(PreInit), nameof(Builder))]
|
|
||||||
// internal class EcsPreInitProcessWrapper : IEcsProcessWrapper, IEcsPreInitProcess
|
|
||||||
// {
|
|
||||||
// public EcsPreInitProcessWrapper(object target, Action a) { system = target; this.a = a; }
|
|
||||||
// [MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|
||||||
// public void PreInit() => a();
|
|
||||||
// public static IEcsProcess Builder(object target, MethodInfo method)
|
|
||||||
// {
|
|
||||||
// if (target is IEcsPreInitProcess) return null;
|
|
||||||
// if (CheckParameters(method))
|
|
||||||
// return new EcsPreInitProcessWrapper(target, CreateAction(target, method));
|
|
||||||
// return null;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
||||||
// [EcsProcessWrapperBuilder(nameof(Init), nameof(Builder))]
|
|
||||||
// internal class EcsInitProcessWrapper : IEcsProcessWrapper, IEcsInitProcess
|
|
||||||
// {
|
|
||||||
// public EcsInitProcessWrapper(object target, Action a) { system = target; this.a = a; }
|
|
||||||
// [MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|
||||||
// public void Init() => a();
|
|
||||||
// public static IEcsProcess Builder(object target, MethodInfo method)
|
|
||||||
// {
|
|
||||||
// if (target is IEcsInitProcess) return null;
|
|
||||||
// if (CheckParameters(method))
|
|
||||||
// return new EcsInitProcessWrapper(target, CreateAction(target, method));
|
|
||||||
// return null;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
||||||
// [EcsProcessWrapperBuilder(nameof(Run), nameof(Builder))]
|
|
||||||
// internal class EcsRunProcessEmptyWrapper : IEcsProcessWrapper, IEcsRunProcess
|
|
||||||
// {
|
|
||||||
// public EcsRunProcessEmptyWrapper(object target, Action a) { system = target; this.a = a; }
|
|
||||||
// [MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|
||||||
// public void Run() => a();
|
|
||||||
// public static IEcsProcess Builder(object target, MethodInfo method)
|
|
||||||
// {
|
|
||||||
// if (target is IEcsRunProcess) return null;
|
|
||||||
// if (CheckParameters(method))
|
|
||||||
// return new EcsRunProcessEmptyWrapper(target, CreateAction(target, method));
|
|
||||||
// return null;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
||||||
// [EcsProcessWrapperBuilder(nameof(Destroy), nameof(Builder))]
|
|
||||||
// internal class EcsDestroyProcessEmptyWrapper : IEcsProcessWrapper, IEcsDestroyProcess
|
|
||||||
// {
|
|
||||||
// public EcsDestroyProcessEmptyWrapper(object target, Action a) { system = target; this.a = a; }
|
|
||||||
// [MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|
||||||
// public void Destroy() => a();
|
|
||||||
// public static IEcsProcess Builder(object target, MethodInfo method)
|
|
||||||
// {
|
|
||||||
// if (target is IEcsRunProcess) return null;
|
|
||||||
// if (CheckParameters(method))
|
|
||||||
// return new EcsDestroyProcessEmptyWrapper(target, CreateAction(target, method));
|
|
||||||
// return null;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// /*
|
|
||||||
// public interface ISomeCustomeProcess : IEcsProcess
|
|
||||||
// {
|
|
||||||
// void DoSomething();
|
|
||||||
// }
|
|
||||||
// //Только при наличии этого атрибута будет вызван метод Builder который создаст обертку для DoSomething
|
|
||||||
// [EcsProcessWrapperBuilder(nameof(DoSomething), nameof(Builder))]
|
|
||||||
// internal class SomeCustomeProcessWrapper : ISomeCustomeProcess, IEcsDebugMetaProvider
|
|
||||||
// {
|
|
||||||
// public object system;
|
|
||||||
// public Action action;
|
|
||||||
// //IEcsDebugMetaProvider.DebugMetaSource используется чтобы для обертки отображалось данные из debug-атрибутов вроде DebugName
|
|
||||||
// public object DebugMetaSource => system;
|
|
||||||
// public SomeCustomeProcessWrapper(object system, Action action) { this.system = system; this.action = action; }
|
|
||||||
// public void DoSomething() => action();
|
|
||||||
// public static IEcsProcess Builder(object system, MethodInfo method)
|
|
||||||
// {
|
|
||||||
// //Исключает те системы которые уже имеют интерфейс, иначе в рантайме вызов метода-процесса будет дублироваться
|
|
||||||
// if (system is ISomeCustomeProcess) return null; //возвращение null
|
|
||||||
// return new SomeCustomeProcessWrapper(system, EcsAutoProcessUtility.CreateDelegate<Action>(system, method));
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// */
|
|
||||||
//}
|
|
||||||
//
|
|
@ -1,11 +0,0 @@
|
|||||||
fileFormatVersion: 2
|
|
||||||
guid: b12c6a19f3706144c80a1d33f86ec659
|
|
||||||
MonoImporter:
|
|
||||||
externalObjects: {}
|
|
||||||
serializedVersion: 2
|
|
||||||
defaultReferences: []
|
|
||||||
executionOrder: 0
|
|
||||||
icon: {instanceID: 0}
|
|
||||||
userData:
|
|
||||||
assetBundleName:
|
|
||||||
assetBundleVariant:
|
|
7
src/Processes.cs
Normal file
7
src/Processes.cs
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
namespace DCFApixels.DragonECS
|
||||||
|
{
|
||||||
|
public interface IInjectRaw : IEcsSystem
|
||||||
|
{
|
||||||
|
void Inject(object obj);
|
||||||
|
}
|
||||||
|
}
|
@ -1,7 +1,6 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Runtime.CompilerServices;
|
using System.Runtime.CompilerServices;
|
||||||
using System.Runtime.Serialization;
|
|
||||||
|
|
||||||
namespace DCFApixels.DragonECS
|
namespace DCFApixels.DragonECS
|
||||||
{
|
{
|
||||||
@ -34,6 +33,5 @@ namespace DCFApixels.DragonECS
|
|||||||
public EcsAutoInjectionException() { }
|
public EcsAutoInjectionException() { }
|
||||||
public EcsAutoInjectionException(string message) : base(EcsConsts.EXCEPTION_MESSAGE_PREFIX + message) { }
|
public EcsAutoInjectionException(string message) : base(EcsConsts.EXCEPTION_MESSAGE_PREFIX + message) { }
|
||||||
public EcsAutoInjectionException(string message, Exception inner) : base(EcsConsts.EXCEPTION_MESSAGE_PREFIX + message, inner) { }
|
public EcsAutoInjectionException(string message, Exception inner) : base(EcsConsts.EXCEPTION_MESSAGE_PREFIX + message, inner) { }
|
||||||
protected EcsAutoInjectionException(SerializationInfo info, StreamingContext context) : base(info, context) { }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user