Просмотр исходного кода

使用新的对象事件系统,类似Unity的Awake Update, 相比较Unity的事件系统, 这个事件系统可以支持扩展方法,这样就可以支持reload

tanghai 9 лет назад
Родитель
Сommit
5c41fbbdd6
30 измененных файлов с 284 добавлено и 360 удалено
  1. 3 0
      Server/Base/Server.Base.csproj
  2. 21 0
      Server/Controller/Component/RealmGateAddressComponent.cs
  3. 4 0
      Server/Controller/Server.Controller.csproj
  4. 1 9
      Server/Model/Component/AppManagerComponent.cs
  5. 1 9
      Server/Model/Component/GateSessionKeyComponent.cs
  6. 1 23
      Server/Model/Component/RealmGateAddressComponent.cs
  7. 1 9
      Server/Model/Component/StartConfigComponent.cs
  8. 55 0
      Unity/Assets/Plugins/Base/Helper/MethodInfoHelper.cs
  9. 12 0
      Unity/Assets/Plugins/Base/Helper/MethodInfoHelper.cs.meta
  10. 1 22
      Unity/Assets/Scripts/Component/BenchmakComponent.cs
  11. 1 9
      Unity/Assets/Scripts/Component/ClientConfigComponent.cs
  12. 6 14
      Unity/Assets/Scripts/Component/EventComponent.cs
  13. 2 12
      Unity/Assets/Scripts/Component/GameObjectComponent.cs
  14. 1 15
      Unity/Assets/Scripts/Component/MessageDispatherComponent.cs
  15. 1 20
      Unity/Assets/Scripts/Component/NetInnerComponent.cs
  16. 1 20
      Unity/Assets/Scripts/Component/NetOuterComponent.cs
  17. 2 13
      Unity/Assets/Scripts/Component/RobotComponent.cs
  18. 1 10
      Unity/Assets/Scripts/Component/TimerComponent.cs
  19. 1 15
      Unity/Assets/Scripts/Component/UIComponent.cs
  20. 2 1
      Unity/Assets/Scripts/Entity/Session.cs
  21. 5 5
      Unity/Assets/Scripts/Message/AppType.cs
  22. 1 1
      Unity/Assets/Scripts/Object/Component.cs
  23. 6 0
      Unity/Assets/Scripts/Object/DisposerEventAttribute.cs
  24. 112 146
      Unity/Assets/Scripts/Object/DisposerEventManager.cs
  25. 2 2
      Unity/Assets/Scripts/Object/DisposerEventManager.cs.meta
  26. 2 1
      Unity/Assets/Scripts/Other/Options.cs
  27. 28 0
      Unity/Controller/Component/BenchmarkComponentE.cs
  28. 1 0
      Unity/Controller/Unity.Controller.csproj
  29. 5 2
      Unity/Unity.Plugins.csproj
  30. 4 2
      Unity/Unity.csproj

+ 3 - 0
Server/Base/Server.Base.csproj

@@ -68,6 +68,9 @@
     <Compile Include="..\..\Unity\Assets\Plugins\Base\Helper\MD5Helper.cs">
       <Link>Helper\MD5Helper.cs</Link>
     </Compile>
+    <Compile Include="..\..\Unity\Assets\Plugins\Base\Helper\MethodInfoHelper.cs">
+      <Link>Helper\MethodInfoHelper.cs</Link>
+    </Compile>
     <Compile Include="..\..\Unity\Assets\Plugins\Base\Helper\MongoHelper.cs">
       <Link>Helper\MongoHelper.cs</Link>
     </Compile>

+ 21 - 0
Server/Controller/Component/RealmGateAddressComponent.cs

@@ -0,0 +1,21 @@
+using Model;
+
+namespace Controller
+{
+	[DisposerEvent(typeof(RealmGateAddressComponent))]
+	public static class RealmGateAddressComponentE
+	{
+		public static void Awake(this RealmGateAddressComponent component)
+		{
+			StartConfig[] startConfigs = component.GetComponent<StartConfigComponent>().GetAll();
+			foreach (StartConfig config in startConfigs)
+			{
+				if (!config.AppType.Is(AppType.Gate))
+				{
+					continue;
+				}
+				component.GateAddress.Add(config);
+			}
+		}
+	}
+}

+ 4 - 0
Server/Controller/Server.Controller.csproj

@@ -34,6 +34,10 @@
     <Reference Include="System.Core" />
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="..\..\Unity\Controller\Component\BenchmarkComponentE.cs">
+      <Link>Component\BenchmarkComponentE.cs</Link>
+    </Compile>
+    <Compile Include="Component\RealmGateAddressComponent.cs" />
     <Compile Include="Message\C2G_LoginGateHandler.cs" />
     <Compile Include="Message\C2R_PingHandler.cs" />
     <Compile Include="Message\M2A_ReloadHandler.cs" />

+ 1 - 9
Server/Model/Component/AppManagerComponent.cs

@@ -6,15 +6,7 @@ using Base;
 
 namespace Model
 {
-	[DisposerEvent]
-	public class AppManagerComponentEvent : DisposerEvent<AppManagerComponent>, IAwake
-	{
-		public void Awake()
-		{
-			this.GetValue().Awake();
-		}
-	}
-
+	[DisposerEvent(typeof(AppManagerComponent))]
 	public class AppManagerComponent: Component
 	{
 		private readonly Dictionary<int, Process> processes = new Dictionary<int, Process>();

+ 1 - 9
Server/Model/Component/GateSessionKeyComponent.cs

@@ -3,15 +3,7 @@ using Base;
 
 namespace Model
 {
-	[DisposerEvent]
-	public class GateSessionKeyComponentEvent : DisposerEvent<GateSessionKeyComponent>, IAwake
-	{
-		public void Awake()
-		{
-			this.GetValue().Awake();
-		}
-	}
-
+	[DisposerEvent(typeof(GateSessionKeyComponent))]
 	public class GateSessionKeyComponent : Component
 	{
 		private TimerComponent timerComponent;

+ 1 - 23
Server/Model/Component/RealmGateAddressComponent.cs

@@ -3,31 +3,9 @@ using Base;
 
 namespace Model
 {
-	[DisposerEvent]
-	public class RealmGateAddressComponentEvent : DisposerEvent<RealmGateAddressComponent>, IAwake
-	{
-		public void Awake()
-		{
-			this.GetValue().Awake();
-		}
-	}
-
 	public class RealmGateAddressComponent : Component
 	{
-		private readonly List<StartConfig> GateAddress = new List<StartConfig>();
-
-		public void Awake()
-		{
-			StartConfig[] startConfigs = this.GetComponent<StartConfigComponent>().GetAll();
-			foreach (StartConfig config in startConfigs)
-			{
-				if (!config.AppType.Is(AppType.Gate))
-				{
-					continue;
-				}
-				this.GateAddress.Add(config);
-			}
-		}
+		public readonly List<StartConfig> GateAddress = new List<StartConfig>();
 
 		public StartConfig GetAddress()
 		{

+ 1 - 9
Server/Model/Component/StartConfigComponent.cs

@@ -6,15 +6,7 @@ using CommandLine;
 
 namespace Model
 {
-	[DisposerEvent]
-	public class StartConfigComponentEvent : DisposerEvent<StartConfigComponent>, IAwake<string[]>
-	{
-		public void Awake(string[] args)
-		{
-			this.GetValue().Awake(args);
-		}
-	}
-
+	[DisposerEvent(typeof(StartConfigComponent))]
 	public class StartConfigComponent: Component
 	{
 		private readonly List<StartConfig> allConfigs = new List<StartConfig>();

+ 55 - 0
Unity/Assets/Plugins/Base/Helper/MethodInfoHelper.cs

@@ -0,0 +1,55 @@
+using System.Reflection;
+
+namespace Base
+{
+	public static class MethodInfoHelper
+	{
+		public static void Run(this MethodInfo methodInfo, object obj)
+		{
+			if (methodInfo.IsStatic)
+			{
+				methodInfo.Invoke(null, new object[] { obj });
+			}
+			else
+			{
+				methodInfo.Invoke(obj, new object[] { });
+			}
+		}
+
+		public static void Run(this MethodInfo methodInfo, object obj, object p1)
+		{
+			if (methodInfo.IsStatic)
+			{
+				methodInfo.Invoke(null, new object[] { obj, p1 });
+			}
+			else
+			{
+				methodInfo.Invoke(obj, new object[] { p1 });
+			}
+		}
+
+		public static void Run(this MethodInfo methodInfo, object obj, object p1, object p2)
+		{
+			if (methodInfo.IsStatic)
+			{
+				methodInfo.Invoke(null, new object[] { obj, p1, p2 });
+			}
+			else
+			{
+				methodInfo.Invoke(obj, new object[] { p1, p2 });
+			}
+		}
+
+		public static void Run(this MethodInfo methodInfo, object obj, object p1, object p2, object p3)
+		{
+			if (methodInfo.IsStatic)
+			{
+				methodInfo.Invoke(null, new object[] { obj, p1, p2, p3 });
+			}
+			else
+			{
+				methodInfo.Invoke(obj, new object[] { p1, p2, p3 });
+			}
+		}
+	}
+}

+ 12 - 0
Unity/Assets/Plugins/Base/Helper/MethodInfoHelper.cs.meta

@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: f6c057a0a9e5e6e4f869e977024352d4
+timeCreated: 1479721303
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 1 - 22
Unity/Assets/Scripts/Component/BenchmakComponent.cs

@@ -3,34 +3,13 @@ using Base;
 
 namespace Model
 {
-	[DisposerEvent]
-	public class BenchmakComponentEvent : DisposerEvent<BenchmakComponent>, IAwake<string>
-	{
-		public void Awake(string address)
-		{
-			BenchmakComponent component = this.GetValue();
-			component.Awake(address);
-		}
-	}
-
 	public class BenchmakComponent : Component
 	{
 		private int k;
 
 		private long time1 = TimeHelper.ClientNow();
 
-		public async void Awake(string address)
-		{
-			NetOuterComponent networkComponent = Game.Scene.GetComponent<NetOuterComponent>();
-
-			for (int i = 0; i < 100; i++)
-			{
-				await Game.Scene.GetComponent<TimerComponent>().WaitAsync(10);
-				TestAsync(networkComponent, address, i);
-			}
-		}
-
-		private async void TestAsync(NetOuterComponent networkComponent, string address, int j)
+		public async void TestAsync(NetOuterComponent networkComponent, string address, int j)
 		{
 			try
 			{

+ 1 - 9
Unity/Assets/Scripts/Component/ClientConfigComponent.cs

@@ -3,15 +3,7 @@ using Base;
 
 namespace Model
 {
-	[DisposerEvent]
-	public class ClientConfigComponentEvent : DisposerEvent<ClientConfigComponent>, IAwake
-	{
-		public void Awake()
-		{
-			this.GetValue().Awake();
-		}
-	}
-
+	[DisposerEvent(typeof(ClientConfigComponent))]
 	public class ClientConfigComponent : Component
     {
 		public StartConfig Config { get; private set; }

+ 6 - 14
Unity/Assets/Scripts/Component/EventComponent.cs

@@ -5,27 +5,19 @@ using Base;
 
 namespace Model
 {
-	[DisposerEvent]
-	public class EventComponentEvent : DisposerEvent<EventComponent>, ILoader, IAwake
-	{
-		public void Load()
-		{
-			this.GetValue().Load();
-		}
-
-		public void Awake()
-		{
-			this.GetValue().Load();
-		}
-	}
-
 	/// <summary>
 	/// 事件分发
 	/// </summary>
+	[DisposerEvent(typeof(EventComponent))]
 	public class EventComponent: Component
 	{
 		private Dictionary<EventIdType, List<object>> allEvents;
 
+		public void Awake()
+		{
+			this.Load();
+		}
+
 		public void Load()
 		{
 			this.allEvents = new Dictionary<EventIdType, List<object>>();

+ 2 - 12
Unity/Assets/Scripts/Component/GameObjectComponent.cs

@@ -1,18 +1,8 @@
-using Base;
-using UnityEngine;
-using Component = UnityEngine.Component;
+using UnityEngine;
 
 namespace Model
 {
-	[DisposerEvent]
-	public class GameObjectComponentEvent : DisposerEvent<GameObjectComponent>, IAwake<GameObject>
-	{
-		public void Awake(GameObject gameObject)
-		{
-			this.GetValue().Awake(gameObject);
-		}
-	}
-
+	[DisposerEvent(typeof(GameObjectComponent))]
 	public class GameObjectComponent : Component
     {
 		public GameObject GameObject { get; private set; }

+ 1 - 15
Unity/Assets/Scripts/Component/MessageDispatherComponent.cs

@@ -5,24 +5,10 @@ using Base;
 
 namespace Model
 {
-	[DisposerEvent]
-	public class MessageHandlerComponentEvent : DisposerEvent<MessageDispatherComponent>, ILoader, IAwake<AppType>
-	{
-		public void Load()
-		{
-			this.GetValue().Load();
-		}
-
-		public void Awake(AppType appType)
-		{
-			this.GetValue().Awake(appType);
-		}
-	}
-
-	
 	/// <summary>
 	/// 消息分发组件
 	/// </summary>
+	[DisposerEvent(typeof(MessageDispatherComponent))]
 	public class MessageDispatherComponent: Component
 	{
 		private AppType AppType;

+ 1 - 20
Unity/Assets/Scripts/Component/NetInnerComponent.cs

@@ -3,26 +3,7 @@ using Base;
 
 namespace Model
 {
-	[DisposerEvent]
-	public class NetInnerComponentEvent : DisposerEvent<NetInnerComponent>, IUpdate, IAwake, IAwake<string, int>
-	{
-		public void Update()
-		{
-			NetworkComponent component = this.GetValue();
-			component.Update();
-		}
-
-		public void Awake()
-		{
-			this.GetValue().Awake();
-		}
-
-		public void Awake(string host, int port)
-		{
-			this.GetValue().Awake(host, port);
-		}
-	}
-
+	[DisposerEvent(typeof(NetInnerComponent))]
 	public class NetInnerComponent : NetworkComponent
 	{
 		private readonly Dictionary<string, Session> adressSessions = new Dictionary<string, Session>();

+ 1 - 20
Unity/Assets/Scripts/Component/NetOuterComponent.cs

@@ -2,26 +2,7 @@
 
 namespace Model
 {
-	[DisposerEvent]
-	public class NetOuterComponentEvent : DisposerEvent<NetOuterComponent>, IUpdate, IAwake, IAwake<string, int>
-	{
-		public void Update()
-		{
-			NetworkComponent component = this.GetValue();
-			component.Update();
-		}
-
-		public void Awake()
-		{
-			this.GetValue().Awake();
-		}
-
-		public void Awake(string host, int port)
-		{
-			this.GetValue().Awake(host, port);
-		}
-	}
-
+	[DisposerEvent(typeof(NetOuterComponent))]
 	public class NetOuterComponent : NetworkComponent
 	{
 		public void Awake()

+ 2 - 13
Unity/Assets/Scripts/Component/RobotComponent.cs

@@ -1,17 +1,6 @@
-using Base;
-
-namespace Model
+namespace Model
 {
-	[DisposerEvent]
-	public class RobotComponentEvent : DisposerEvent<RobotComponent>, IAwake
-	{
-		public void Awake()
-		{
-			RobotComponent component = this.GetValue();
-			component.Awake();
-		}
-	}
-
+	[DisposerEvent(typeof(RobotComponent))]
 	public class RobotComponent : Component
     {
 		public void Awake()

+ 1 - 10
Unity/Assets/Scripts/Component/TimerComponent.cs

@@ -12,16 +12,7 @@ namespace Model
 		public TaskCompletionSource<bool> tcs;
 	}
 
-	[DisposerEvent]
-	public class TimerComponentEvent : DisposerEvent<TimerComponent>, IUpdate
-	{
-		public void Update()
-		{
-			TimerComponent component = this.GetValue();
-			component.Update();
-		}
-	}
-
+	[DisposerEvent(typeof(TimerComponent))]
 	public class TimerComponent: Component
 	{
 		private readonly Dictionary<long, Timer> timers = new Dictionary<long, Timer>();

+ 1 - 15
Unity/Assets/Scripts/Component/UIComponent.cs

@@ -7,24 +7,10 @@ using UnityEngine;
 
 namespace Model
 {
-	[DisposerEvent]
-	public class UIComponentEvent : DisposerEvent<UIComponent>, IAwake, ILoader
-	{
-		public void Load()
-		{
-			UIComponent component = GetValue();
-			component.Load();
-		}
-
-		public void Awake()
-		{
-			this.GetValue().Awake();
-		}
-	}
-	
 	/// <summary>
 	/// 管理所有UI
 	/// </summary>
+	[DisposerEvent(typeof(UIComponent))]
 	public class UIComponent: Component
 	{
         private UI Root;

+ 2 - 1
Unity/Assets/Scripts/Entity/Session.cs

@@ -3,6 +3,7 @@ using System.Collections.Generic;
 using System.Threading;
 using System.Threading.Tasks;
 using Base;
+using MongoDB.Bson;
 
 namespace Model
 {
@@ -206,7 +207,7 @@ namespace Model
 				rpcId = rpcId | 0x40000000;
 			}
 
-			byte[] messageBytes = MongoHelper.ToBson(message);
+			byte[] messageBytes = message.ToBson();
 			if (messageBytes.Length > 100)
 			{
 				byte[] newMessageBytes = ZipHelper.Compress(messageBytes);

+ 5 - 5
Unity/Assets/Scripts/Message/AppType.cs

@@ -10,13 +10,13 @@ namespace Model
 		Manager = 1,
 		Realm = 2,
 		Gate = 4,
-		// 7
-		AllServer = Manager | Realm | Gate,
 
-		Benchmark,
+		Benchmark = 8,
+		Client = 16,
+		Robot = 32,
 
-		Client,
-		Robot,
+		// 7
+		AllServer = Manager | Realm | Gate,
 	}
 
 	public static class AppTypeHelper

+ 1 - 1
Unity/Assets/Scripts/Object/Component.cs

@@ -21,7 +21,7 @@ namespace Model
 		{
 		}
 
-		protected T GetComponent<T>() where T: Component
+		public T GetComponent<T>() where T: Component
 		{
 			return this.Owner.GetComponent<T>();
 		}

+ 6 - 0
Unity/Assets/Scripts/Object/DisposerEventAttribute.cs

@@ -5,5 +5,11 @@ namespace Model
 	[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]
 	public class DisposerEventAttribute: Attribute
 	{
+		public Type ClassType;
+
+		public DisposerEventAttribute(Type classType)
+		{
+			this.ClassType = classType;
+		}
 	}
 }

+ 112 - 146
Unity/Assets/Scripts/Object/DisposerEventManager.cs

@@ -6,29 +6,43 @@ using Base;
 
 namespace Model
 {
-	public interface IDisposerEvent
+	[Flags]
+	public enum DisposerEventType
 	{
-		Type ValueType();
-		void SetValue(object value);
+		Awake = 1,
+		Awake1 = 2,
+		Awake2 = 4,
+		Awake3 = 8,
+		Update = 16,
+		Load = 32,
 	}
 
-	public abstract class DisposerEvent<T> : IDisposerEvent
+	public class DisposerTypeInfo
 	{
-		private T value;
+		private readonly Dictionary<DisposerEventType, MethodInfo> infos = new Dictionary<DisposerEventType, MethodInfo>();
 
-		protected T GetValue()
+		public void Add(DisposerEventType type, MethodInfo methodInfo)
 		{
-			return value;
+			try
+			{
+				this.infos.Add(type, methodInfo);
+			}
+			catch (Exception e)
+			{
+				throw new Exception($"Add DisposerEventType MethodInfo Error: {type}", e);
+			}
 		}
 
-		public void SetValue(object v)
+		public MethodInfo Get(DisposerEventType type)
 		{
-			this.value = (T)v;
+			MethodInfo methodInfo;
+			this.infos.TryGetValue(type, out methodInfo);
+			return methodInfo;
 		}
 
-		public Type ValueType()
+		public DisposerEventType[] GetDisposerEvent2Types()
 		{
-			return typeof(T);
+			return this.infos.Keys.ToArray();
 		}
 	}
 
@@ -36,204 +50,156 @@ namespace Model
 	{
 		private readonly Dictionary<string, Assembly> assemblies = new Dictionary<string, Assembly>();
 
-		private Dictionary<Type, IDisposerEvent> disposerEvents;
+		private readonly Dictionary<DisposerEventType, HashSet<Disposer>> disposers = new Dictionary<DisposerEventType, HashSet<Disposer>>();
+
+		private Dictionary<Type, DisposerTypeInfo> eventInfo;
 
-		private readonly HashSet<Disposer> updates = new HashSet<Disposer>();
-		private readonly HashSet<Disposer> loaders = new HashSet<Disposer>();
+		public DisposerEventManager()
+		{
+			foreach (DisposerEventType t in Enum.GetValues(typeof(DisposerEventType)))
+			{
+				this.disposers.Add(t, new HashSet<Disposer>());
+			}
+		}
 
 		public void Register(string name, Assembly assembly)
 		{
-			this.assemblies[name] = assembly;
+			this.eventInfo = new Dictionary<Type, DisposerTypeInfo>();
 
-			this.disposerEvents = new Dictionary<Type, IDisposerEvent>();
+			this.assemblies[name] = assembly;
+			
 			foreach (Assembly ass in this.assemblies.Values)
 			{
 				Type[] types = ass.GetTypes();
 				foreach (Type type in types)
 				{
-					object[] attrs = type.GetCustomAttributes(typeof(DisposerEventAttribute), false);
-
+					object[] attrs = type.GetCustomAttributes(typeof(DisposerEventAttribute), true);
 					if (attrs.Length == 0)
 					{
 						continue;
 					}
 
-					object obj = Activator.CreateInstance(type);
-					IDisposerEvent disposerEvent = obj as IDisposerEvent;
-					if (disposerEvent == null)
+					DisposerEventAttribute DisposerEventAttribute = attrs[0] as DisposerEventAttribute;
+
+					Type type2 = DisposerEventAttribute.ClassType;
+
+					if (!this.eventInfo.ContainsKey(type2))
+					{
+						this.eventInfo.Add(type2, new DisposerTypeInfo());
+					}
+
+					foreach (MethodInfo methodInfo in type.GetMethods())
 					{
-						Log.Error($"组件事件没有继承IComponentEvent: {type.Name}");
+						int n = methodInfo.GetParameters().Length;
+						if (methodInfo.IsStatic)
+						{
+							--n;
+						}
+						string sn = n > 0? $"{methodInfo.Name}{n}" : methodInfo.Name;
+						foreach (string s in Enum.GetNames(typeof(DisposerEventType)))
+						{
+							if (s != sn)
+							{
+								continue;
+							}
+							DisposerEventType t = EnumHelper.FromString<DisposerEventType>(s);
+							this.eventInfo[type2].Add(t, methodInfo);
+							break;
+						}
 					}
-					this.disposerEvents[disposerEvent.ValueType()] = disposerEvent;
 				}
 			}
 
 			this.Load();
 		}
 
-		public Assembly GetAssembly(string name)
-		{
-			return this.assemblies[name];
-		}
-
-		public Assembly[] GetAssemblies()
-		{
-			return this.assemblies.Values.ToArray();
-		}
-
-		private void Load()
-		{
-			foreach (Disposer disposer in this.loaders)
-			{
-				IDisposerEvent disposerEvent;
-				if (!this.disposerEvents.TryGetValue(disposer.GetType(), out disposerEvent))
-				{
-					continue;
-				}
-				ILoader iLoader = disposerEvent as ILoader;
-				if (iLoader == null)
-				{
-					continue;
-				}
-				disposerEvent.SetValue(disposer);
-				iLoader.Load();
-			}
-		}
-
 		public void Add(Disposer disposer)
 		{
-			if (this.disposerEvents == null)
-			{
-				return;
-			}
-			
-			IDisposerEvent disposerEvent;
-			if (!this.disposerEvents.TryGetValue(disposer.GetType(), out disposerEvent))
+			DisposerTypeInfo disposerTypeInfo;
+			if (!this.eventInfo.TryGetValue(disposer.GetType(), out disposerTypeInfo))
 			{
 				return;
 			}
 
-			IUpdate iUpdate = disposerEvent as IUpdate;
-			if (iUpdate != null)
+			foreach (DisposerEventType disposerEvent2Type in disposerTypeInfo.GetDisposerEvent2Types())
 			{
-				this.updates.Add(disposer);
-			}
-
-			ILoader iLoader = disposerEvent as ILoader;
-			if (iLoader != null)
-			{
-				this.loaders.Add(disposer);
+				this.disposers[disposerEvent2Type].Add(disposer);
 			}
 		}
 
 		public void Remove(Disposer disposer)
 		{
-			IDisposerEvent disposerEvent;
-			if (!this.disposerEvents.TryGetValue(disposer.GetType(), out disposerEvent))
+			DisposerTypeInfo disposerTypeInfo;
+			if (!this.eventInfo.TryGetValue(disposer.GetType(), out disposerTypeInfo))
 			{
 				return;
 			}
 
-			IUpdate iUpdate = disposerEvent as IUpdate; 
-			if (iUpdate != null)
+			foreach (DisposerEventType disposerEvent2Type in disposerTypeInfo.GetDisposerEvent2Types())
 			{
-				this.updates.Remove(disposer);
+				this.disposers[disposerEvent2Type].Remove(disposer);
 			}
+		}
 
-			ILoader iLoader = disposerEvent as ILoader;
-			if (iLoader != null)
-			{
-				this.loaders.Remove(disposer);
-			}
+		public Assembly GetAssembly(string name)
+		{
+			return this.assemblies[name];
 		}
 
-		public void Awake(Disposer disposer)
+		public Assembly[] GetAssemblies()
 		{
-			IDisposerEvent disposerEvent;
-			if (!this.disposerEvents.TryGetValue(disposer.GetType(), out disposerEvent))
-			{
-				return;
-			}
-			IAwake iAwake = disposerEvent as IAwake;
-			if (iAwake == null)
-			{
-				return;
-			}
-			disposerEvent.SetValue(disposer);
-			iAwake.Awake();
+			return this.assemblies.Values.ToArray();
 		}
 
-		public void Awake<P1>(Disposer disposer, P1 p1)
+		private void Load()
 		{
-			IDisposerEvent disposerEvent;
-			if (!this.disposerEvents.TryGetValue(disposer.GetType(), out disposerEvent))
+			HashSet<Disposer> list;
+			if (!this.disposers.TryGetValue(DisposerEventType.Update, out list))
 			{
 				return;
 			}
-			IAwake<P1> iAwake = disposerEvent as IAwake<P1>;
-			if (iAwake == null)
+			foreach (Disposer disposer in list)
 			{
-				return;
+				DisposerTypeInfo disposerTypeInfo = this.eventInfo[disposer.GetType()];
+				disposerTypeInfo.Get(DisposerEventType.Load).Run(disposer);
 			}
-			disposerEvent.SetValue(disposer);
-			iAwake.Awake(p1);
 		}
 
-		public void Awake<P1, P2>(Disposer disposer, P1 p1, P2 p2)
+		public void Awake(Disposer disposer)
 		{
-			IDisposerEvent disposerEvent;
-			if (!this.disposerEvents.TryGetValue(disposer.GetType(), out disposerEvent))
-			{
-				return;
-			}
-			IAwake<P1, P2> iAwake = disposerEvent as IAwake<P1, P2>;
-			if (iAwake == null)
-			{
-				return;
-			}
-			disposerEvent.SetValue(disposer);
-			iAwake.Awake(p1, p2);
+			DisposerTypeInfo disposerTypeInfo = this.eventInfo[disposer.GetType()];
+			disposerTypeInfo.Get(DisposerEventType.Awake)?.Run(disposer);
 		}
 
-		public void Awake<P1, P2, P3>(Disposer disposer, P1 p1, P2 p2, P3 p3)
+		public void Awake(Disposer disposer, object p1)
 		{
-			IDisposerEvent disposerEvent;
-			if (!this.disposerEvents.TryGetValue(disposer.GetType(), out disposerEvent))
-			{
-				return;
-			}
-			IAwake<P1, P2, P3> iAwake = disposerEvent as IAwake<P1, P2, P3>;
-			if (iAwake == null)
-			{
-				return;
-			}
-			disposerEvent.SetValue(disposer);
-			iAwake.Awake(p1, p2, p3);
+			DisposerTypeInfo disposerTypeInfo = this.eventInfo[disposer.GetType()];
+			disposerTypeInfo.Get(DisposerEventType.Awake1)?.Run(disposer, p1);
+		}
+
+		public void Awake(Disposer disposer, object p1, object p2)
+		{
+			DisposerTypeInfo disposerTypeInfo = this.eventInfo[disposer.GetType()];
+			disposerTypeInfo.Get(DisposerEventType.Awake2)?.Run(disposer, p1, p2 );
+		}
+
+		public void Awake(Disposer disposer, object p1, object p2, object p3)
+		{
+			DisposerTypeInfo disposerTypeInfo = this.eventInfo[disposer.GetType()];
+			disposerTypeInfo.Get(DisposerEventType.Awake3)?.Run(disposer, p1, p2, p3 );
 		}
-		
+
 		public void Update()
 		{
-			foreach (Disposer disposer in updates)
+			HashSet<Disposer> list;
+			if (!this.disposers.TryGetValue(DisposerEventType.Update, out list))
 			{
-				IDisposerEvent disposerEvent;
-				if (!this.disposerEvents.TryGetValue(disposer.GetType(), out disposerEvent))
-				{
-					continue;
-				}
-				IUpdate iUpdate = disposerEvent as IUpdate;
-				if (iUpdate == null)
-				{
-					continue;
-				}
-				disposerEvent.SetValue(disposer);
-				try
-				{
-					iUpdate.Update();
-				}
-				catch (Exception e)
-				{
-					Log.Error(e.ToString());
-				}
+				return;
+			}
+			foreach (Disposer disposer in list)
+			{
+				DisposerTypeInfo disposerTypeInfo = this.eventInfo[disposer.GetType()];
+				disposerTypeInfo.Get(DisposerEventType.Update).Run(disposer);
 			}
 		}
 	}

+ 2 - 2
Unity/Assets/Scripts/Object/DisposerEventManager.cs.meta

@@ -1,6 +1,6 @@
 fileFormatVersion: 2
-guid: 512d5c4645693064d98e56a3c1c011af
-timeCreated: 1474942922
+guid: 9053a11c1bcabe04d8a2b53044ae0682
+timeCreated: 1479715122
 licenseType: Pro
 MonoImporter:
   serializedVersion: 2

+ 2 - 1
Unity/Assets/Scripts/Other/Options.cs

@@ -1,5 +1,6 @@
 using System;
 using Base;
+using MongoDB.Bson;
 #if SERVER
 using CommandLine;
 #endif
@@ -25,7 +26,7 @@ namespace Model
 
 		public object Clone()
 		{
-			return MongoHelper.FromBson<Options>(MongoHelper.ToBson(this));
+			return MongoHelper.FromBson<Options>(this.ToBson());
 		}
 	}
 }

+ 28 - 0
Unity/Controller/Component/BenchmarkComponentE.cs

@@ -0,0 +1,28 @@
+using System;
+using Base;
+using Model;
+
+namespace Controller
+{
+	[DisposerEvent(typeof(BenchmakComponent))]
+	public static class BenchmakComponentE
+	{
+		public static async void Awake(this BenchmakComponent component, string address)
+		{
+			try
+			{
+				NetOuterComponent networkComponent = Game.Scene.GetComponent<NetOuterComponent>();
+
+				for (int i = 0; i < 100; i++)
+				{
+					await Game.Scene.GetComponent<TimerComponent>().WaitAsync(10);
+					component.TestAsync(networkComponent, address, i);
+				}
+			}
+			catch (Exception e)
+			{
+				Log.Error(e.ToString());
+			}
+		}
+	}
+}

+ 1 - 0
Unity/Controller/Unity.Controller.csproj

@@ -53,6 +53,7 @@
     </Reference>
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="Component\BenchmarkComponentE.cs" />
     <Compile Include="Event\InitSceneStartEvent_InitGame.cs" />
     <Compile Include="Message\R2C_ServerLogHandler.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />

+ 5 - 2
Unity/Unity.Plugins.csproj

@@ -13,11 +13,13 @@
     <TargetFrameworkIdentifier>.NETFramework</TargetFrameworkIdentifier>
     <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
     <TargetFrameworkProfile>Unity Full v3.5</TargetFrameworkProfile>
-    <CompilerResponseFile></CompilerResponseFile>
+    <CompilerResponseFile>
+    </CompilerResponseFile>
     <UnityProjectType>GamePlugins:3</UnityProjectType>
     <UnityBuildTarget>StandaloneWindows:5</UnityBuildTarget>
     <UnityVersion>5.4.1f1</UnityVersion>
-    <RootNamespace></RootNamespace>
+    <RootNamespace>
+    </RootNamespace>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
     <DebugType>pdbonly</DebugType>
@@ -72,6 +74,7 @@
   </ItemGroup>
   <ItemGroup>
     <Compile Include="Assets\Plugins\Base\DoubleMap.cs" />
+    <Compile Include="Assets\Plugins\Base\Helper\MethodInfoHelper.cs" />
     <Compile Include="Assets\Plugins\Base\Helper\ArrayHelper.cs" />
     <Compile Include="Assets\Plugins\Base\Helper\ByteHelper.cs" />
     <Compile Include="Assets\Plugins\Base\Helper\EnumHelper.cs" />

+ 4 - 2
Unity/Unity.csproj

@@ -13,11 +13,13 @@
     <TargetFrameworkIdentifier>.NETFramework</TargetFrameworkIdentifier>
     <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
     <TargetFrameworkProfile>Unity Full v3.5</TargetFrameworkProfile>
-    <CompilerResponseFile></CompilerResponseFile>
+    <CompilerResponseFile>
+    </CompilerResponseFile>
     <UnityProjectType>Game:1</UnityProjectType>
     <UnityBuildTarget>StandaloneWindows:5</UnityBuildTarget>
     <UnityVersion>5.4.1f1</UnityVersion>
-    <RootNamespace></RootNamespace>
+    <RootNamespace>
+    </RootNamespace>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
     <DebugType>pdbonly</DebugType>