Sfoglia il codice sorgente

抹平了hotfix层跟mono层消息分发,hotfix跟mono层可以同时订阅同一个消息

tanghai 8 anni fa
parent
commit
1d01430f87

+ 1 - 8
Unity/Assets/Scripts/Base/Message/ClientDispatcher.cs

@@ -18,14 +18,7 @@ namespace Model
 			if (message is AMessage || message is ARequest)
 			{
 				MessageInfo messageInfo = new MessageInfo(opcode, message);
-				if (opcode < 2000)
-				{
-					Game.Scene.GetComponent<EventComponent>().Run(EventIdType.MessageDeserializeFinish, messageInfo);
-				}
-				else
-				{
-					Game.Scene.GetComponent<MessageDispatherComponent>().Handle(messageInfo);
-				}
+				Game.Scene.GetComponent<MessageDispatherComponent>().Handle(messageInfo);
 				return;
 			}
 

+ 111 - 9
Unity/Assets/Scripts/Component/MessageDispatherComponent.cs

@@ -1,8 +1,58 @@
 using System;
 using System.Collections.Generic;
+using System.Reflection;
+using ILRuntime.CLR.Method;
+using ILRuntime.Runtime.Intepreter;
 
 namespace Model
 {
+	/// <summary>
+	/// 用来抹平ILRuntime跟mono层差异
+	/// </summary>
+	public interface IMessageMethod
+	{
+		void Run(AMessage a);
+	}
+
+	public class IMessageMonoMethod : IMessageMethod
+	{
+		private readonly IMHandler iMHandler;
+
+		public IMessageMonoMethod(IMHandler iMHandler)
+		{
+			this.iMHandler = iMHandler;
+		}
+
+		public void Run(AMessage a)
+		{
+			this.iMHandler.Handle(a);
+		}
+	}
+
+	public class IMessageILMethod : IMessageMethod
+	{
+		private readonly ILRuntime.Runtime.Enviorment.AppDomain appDomain;
+		private readonly ILTypeInstance instance;
+		private readonly IMethod method;
+		private readonly object[] param;
+
+		public IMessageILMethod(Type type, string methodName)
+		{
+			appDomain = Init.Instance.AppDomain;
+			this.instance = this.appDomain.Instantiate(type.FullName);
+			this.method = this.instance.Type.GetMethod(methodName);
+			int n = this.method.ParameterCount;
+			this.param = new object[n];
+		}
+
+		public void Run(AMessage a)
+		{
+			this.param[0] = a;
+			this.appDomain.Invoke(this.method, this.instance, param);
+		}
+	}
+
+
 	[ObjectEvent]
 	public class MessageDispatherComponentEvent : ObjectEvent<MessageDispatherComponent>, IAwake, ILoad
 	{
@@ -17,12 +67,41 @@ namespace Model
 		}
 	}
 
+	public static class Opcode2Name
+	{
+		private static Dictionary<int, string> _init = new Dictionary<int, string>();
+		public static string GetName(int code)
+		{
+			if (_init.Count == 0)
+			{
+				Type type = typeof(Opcode);
+				FieldInfo[] fields = type.GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static);
+				foreach (FieldInfo field in fields)
+				{
+					if (!field.IsStatic)
+					{
+						continue;
+					}
+					int codeID = (ushort)field.GetValue(null);
+					if (_init.ContainsKey(codeID))
+					{
+						Log.Warning($"重复的Opcode:{codeID}");
+						continue;
+					}
+					_init.Add(codeID, field.Name);
+				}
+			}
+			return _init[code];
+		}
+	}
+
 	/// <summary>
 	/// 消息分发组件
 	/// </summary>
 	public class MessageDispatherComponent : Component
 	{
-		private Dictionary<ushort, List<IMHandler>> handlers;
+		private Dictionary<ushort, List<IMessageMethod>> handlers;
+
 
 		public void Awake()
 		{
@@ -31,7 +110,7 @@ namespace Model
 
 		public void Load()
 		{
-			handlers = new Dictionary<ushort, List<IMHandler>>();
+			handlers = new Dictionary<ushort, List<IMessageMethod>>();
 
 			Type[] types = DllHelper.GetMonoTypes();
 
@@ -46,26 +125,49 @@ namespace Model
 				IMHandler iMHandler = (IMHandler)Activator.CreateInstance(type);
 				if (!this.handlers.ContainsKey(messageHandlerAttribute.Opcode))
 				{
-					this.handlers.Add(messageHandlerAttribute.Opcode, new List<IMHandler>());
+					this.handlers.Add(messageHandlerAttribute.Opcode, new List<IMessageMethod>());
+				}
+				this.handlers[messageHandlerAttribute.Opcode].Add(new IMessageMonoMethod(iMHandler));
+			}
+
+			// hotfix dll
+			Type[] hotfixTypes = DllHelper.GetHotfixTypes();
+			foreach (Type type in hotfixTypes)
+			{
+				object[] attrs = type.GetCustomAttributes(typeof(MessageHandlerAttribute), false);
+				if (attrs.Length == 0)
+				{
+					continue;
+				}
+				MessageHandlerAttribute messageHandlerAttribute = (MessageHandlerAttribute)attrs[0];
+#if ILRuntime
+				IMessageMethod iMessageMethod = new IMessageILMethod(type, "Run");
+#else
+				IMHandler iMHandler = (IMHandler)Activator.CreateInstance(type);
+				IMessageMethod iMessageMethod = new IMessageMonoMethod(iMHandler);
+#endif
+				if (!this.handlers.ContainsKey(messageHandlerAttribute.Opcode))
+				{
+					this.handlers.Add(messageHandlerAttribute.Opcode, new List<IMessageMethod>());
 				}
-				this.handlers[messageHandlerAttribute.Opcode].Add(iMHandler);
+				this.handlers[messageHandlerAttribute.Opcode].Add(iMessageMethod);
 			}
 		}
 
 		public void Handle(MessageInfo messageInfo)
 		{
-			List<IMHandler> actions;
+			List<IMessageMethod> actions;
 			if (!this.handlers.TryGetValue(messageInfo.Opcode, out actions))
 			{
-				Log.Error($"消息 {messageInfo.Opcode} 没有处理");
+				Log.Error($"消息 {Opcode2Name.GetName(messageInfo.Opcode)}({messageInfo.Opcode}) 没有处理");
 				return;
 			}
 
-			foreach (IMHandler ev in actions)
+			foreach (IMessageMethod ev in actions)
 			{
 				try
 				{
-					ev.Handle(messageInfo.Message);
+					ev.Run(messageInfo.Message);
 				}
 				catch (Exception e)
 				{
@@ -76,7 +178,7 @@ namespace Model
 
 		public override void Dispose()
 		{
-			if (this.Id == 0)
+			if (Id == 0)
 			{
 				return;
 			}

+ 1 - 1
Unity/Hotfix/Base/Message/AMHandler.cs

@@ -7,7 +7,7 @@ namespace Hotfix
 	{
 		protected abstract void Run(Message message);
 
-		public void Handle(object msg)
+		public void Handle(AMessage msg)
 		{
 			Message message = msg as Message;
 			if (message == null)

+ 7 - 1
Unity/Hotfix/Base/Message/IMHandler.cs

@@ -2,9 +2,15 @@
 
 namespace Hotfix
 {
+#if ILRuntime
 	public interface IMHandler
 	{
-		void Handle(object message);
+		void Handle(AMessage message);
 		Type GetMessageType();
 	}
+#else
+	public interface IMHandler : Model.IMHandler
+	{
+	}
+#endif
 }

+ 0 - 89
Unity/Hotfix/Component/MessageDispatherComponent.cs

@@ -1,89 +0,0 @@
-using System;
-using System.Collections.Generic;
-using Model;
-
-namespace Hotfix
-{
-	[ObjectEvent]
-	public class MessageDispatherComponentEvent : ObjectEvent<MessageDispatherComponent>, IAwake, ILoad
-	{
-		public void Awake()
-		{
-			this.Get().Awake();
-		}
-
-		public void Load()
-		{
-			this.Get().Load();
-		}
-	}
-
-	/// <summary>
-	/// 消息分发组件
-	/// </summary>
-	public class MessageDispatherComponent: Component, IAwake, ILoad
-	{
-		private Dictionary<ushort, List<IMHandler>> handlers;
-		
-
-		public void Awake()
-		{
-			this.Load();
-		}
-
-		public void Load()
-		{
-            handlers = new Dictionary<ushort, List<IMHandler>>();
-            
-            Type[] types = DllHelper.GetHotfixTypes();
-
-			foreach (Type type in types)
-			{
-				object[] attrs = type.GetCustomAttributes(typeof(MessageHandlerAttribute), false);
-				if (attrs.Length == 0)
-				{
-					continue;
-				}
-				MessageHandlerAttribute messageHandlerAttribute = (MessageHandlerAttribute)attrs[0];
-				IMHandler iMHandler = (IMHandler)Activator.CreateInstance(type);
-				if (!this.handlers.ContainsKey(messageHandlerAttribute.Opcode))
-				{
-					this.handlers.Add(messageHandlerAttribute.Opcode, new List<IMHandler>());
-				}
-				this.handlers[messageHandlerAttribute.Opcode].Add(iMHandler);
-			}
-		}
-
-		public void Handle(MessageInfo messageInfo)
-		{
-			List<IMHandler> actions;
-			if (!this.handlers.TryGetValue(messageInfo.Opcode, out actions))
-			{
-				Log.Error($"消息 {messageInfo.Opcode} 没有处理");
-				return;
-			}
-
-			foreach (IMHandler ev in actions)
-			{
-				try
-				{
-					ev.Handle(messageInfo.Message);
-				}
-				catch (Exception e)
-				{
-					Log.Error(e.ToStr());
-				}
-			}
-		}
-
-		public override void Dispose()
-		{
-			if (this.Id == 0)
-			{
-				return;
-			}
-
-			base.Dispose();
-		}
-	}
-}

+ 0 - 14
Unity/Hotfix/Event/SessionRecvMessage_Dispatch.cs

@@ -1,14 +0,0 @@
-using Model;
-
-namespace Hotfix
-{
-	// 订阅mono层的Session发出的事件
-	[Event((int)EventIdType.MessageDeserializeFinish)]
-	public class MessageDeserializeFinish_Dispatch: IEvent<MessageInfo>
-	{
-		public void Run(MessageInfo messageInfo)
-		{
-			Hotfix.Scene.GetComponent<MessageDispatherComponent>().Handle(messageInfo);
-		}
-	}
-}

+ 1 - 2
Unity/Hotfix/Unity.Hotfix.csproj

@@ -80,14 +80,12 @@
     <Compile Include="Base\Other\IUIFactory.cs" />
     <Compile Include="Component\GameObjectComponent.cs" />
     <Compile Include="Component\KVComponent.cs" />
-    <Compile Include="Component\MessageDispatherComponent.cs" />
     <Compile Include="Component\TimeComponent.cs" />
     <Compile Include="Component\TimerComponent.cs" />
     <Compile Include="Component\UIComponent.cs" />
     <Compile Include="Entity\Hotfix.cs" />
     <Compile Include="Entity\Scene.cs" />
     <Compile Include="Entity\UI.cs" />
-    <Compile Include="Event\SessionRecvMessage_Dispatch.cs" />
     <Compile Include="Init.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
     <Compile Include="UI\UILobby\Component\UILobbyComponent.cs" />
@@ -97,6 +95,7 @@
     <Compile Include="UI\UILogin\Factory\UILoginFactory.cs" />
   </ItemGroup>
   <ItemGroup>
+    <Folder Include="Event\" />
     <Folder Include="Handler\" />
   </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

+ 2 - 0
Unity/Unity.Editor.Plugins.csproj

@@ -164,6 +164,8 @@
   <ItemGroup>
     <None Include="Assets\Res\Config\BuffConfig.txt" />
     <None Include="Assets\Res\Config\UnitConfig.txt" />
+    <None Include="Assets\StreamingAssets\Logs\Log-Client-Error.txt" />
+    <None Include="Assets\StreamingAssets\Logs\Log-Client-Info.txt" />
   </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <Target Name="GenerateTargetFrameworkMonikerAttribute" />

+ 2 - 0
Unity/Unity.Editor.csproj

@@ -214,6 +214,8 @@
   <ItemGroup>
     <None Include="Assets\Res\Config\BuffConfig.txt" />
     <None Include="Assets\Res\Config\UnitConfig.txt" />
+    <None Include="Assets\StreamingAssets\Logs\Log-Client-Error.txt" />
+    <None Include="Assets\StreamingAssets\Logs\Log-Client-Info.txt" />
   </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <Target Name="GenerateTargetFrameworkMonikerAttribute" />

+ 2 - 0
Unity/Unity.Plugins.csproj

@@ -516,6 +516,8 @@
   <ItemGroup>
     <None Include="Assets\Res\Config\BuffConfig.txt" />
     <None Include="Assets\Res\Config\UnitConfig.txt" />
+    <None Include="Assets\StreamingAssets\Logs\Log-Client-Error.txt" />
+    <None Include="Assets\StreamingAssets\Logs\Log-Client-Info.txt" />
   </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <Target Name="GenerateTargetFrameworkMonikerAttribute" />

+ 2 - 0
Unity/Unity.csproj

@@ -581,6 +581,8 @@
   <ItemGroup>
     <None Include="Assets\Res\Config\BuffConfig.txt" />
     <None Include="Assets\Res\Config\UnitConfig.txt" />
+    <None Include="Assets\StreamingAssets\Logs\Log-Client-Error.txt" />
+    <None Include="Assets\StreamingAssets\Logs\Log-Client-Info.txt" />
   </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <Target Name="GenerateTargetFrameworkMonikerAttribute" />