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

Actor实现做了改动,Actor消息不再由一个消息包裹着发送,而是消息直接带有ActorId, 这样可以减少一次消息序列化反序列化,提升了性能

tanghai 7 лет назад
Родитель
Сommit
b6d1786750
29 измененных файлов с 437 добавлено и 280 удалено
  1. 2 2
      Server/App/NLog.config
  2. 1 1
      Server/App/Program.cs
  3. 1 1
      Server/Hotfix/Helper/MessageHelper.cs
  4. 1 1
      Server/Hotfix/Module/Actor/ActorComponentSystem.cs
  5. 15 26
      Server/Hotfix/Module/Actor/EntityActorHandler.cs
  6. 0 1
      Server/Hotfix/Module/FrameSync/C2M_TestActorRequestHandler.cs
  7. 8 6
      Server/Hotfix/Module/Message/InnerMessageDispatcher.cs
  8. 9 5
      Server/Hotfix/Module/Message/OuterMessageDispatcher.cs
  9. 13 22
      Server/Model/Module/Actor/AMActorHandler.cs
  10. 3 4
      Server/Model/Module/Actor/ActorComponent.cs
  11. 7 0
      Server/Model/Module/Actor/ActorManagerComponent.cs
  12. 4 4
      Server/Model/Module/Actor/ActorMessageDispatherComponent.cs
  13. 9 14
      Server/Model/Module/Actor/ActorProxy.cs
  14. 0 53
      Server/Model/Module/Actor/ActorRequestWrap.cs
  15. 23 0
      Server/Model/Module/Actor/ActorResponse.cs
  16. 6 14
      Server/Model/Module/Actor/ActorTask.cs
  17. 1 1
      Server/Model/Module/Actor/IEntityActorHandler.cs
  18. 1 1
      Server/Model/Module/Actor/IMActorHandler.cs
  19. 31 12
      Server/Model/Module/Message/HotfixMessage.cs
  20. 112 48
      Server/Model/Module/Message/InnerMessage.cs
  21. 61 16
      Server/Model/Module/Message/OuterMessage.cs
  22. 14 8
      Unity/Assets/Editor/Proto2CsEditor/Proto2CSEditor.cs
  23. 11 1
      Unity/Assets/Scripts/Module/FrameSync/FrameMessage.cs
  24. 4 5
      Unity/Assets/Scripts/Module/Message/IActorMessage.cs
  25. 1 1
      Unity/Assets/Scripts/Module/Message/MessageDispatherComponent.cs
  26. 61 16
      Unity/Assets/Scripts/Module/Message/OuterMessage.cs
  27. 3 1
      Unity/Assets/Scripts/Module/Message/Session.cs
  28. 31 12
      Unity/Hotfix/Module/Message/HotfixMessage.cs
  29. 4 4
      Unity/Hotfix/Module/Message/IActorMessage.cs

+ 2 - 2
Server/App/NLog.config

@@ -41,9 +41,9 @@
 		<target name="error" xsi:type="File"
 			fileName="${basedir}/../Logs/Log-${var:appType}-${var:appId}-Error.txt"
 			deleteOldFileOnStartup="false"
-			layout="${longdate} ${var:appTypeFormat} ${var:appIdFormat} ${callsite:className=false:methodName=false:fileName=true:includeSourcePath=false:skipFrames=2} ${message}" />
+			layout="${longdate} ${var:appTypeFormat} ${var:appIdFormat} ${message} ${newline} ${stacktrace:format=Raw:topFrames=10:skipFrames=0}" />
 		<target name="error" type="ColoredConsole"
-			layout="${longdate} ${var:appTypeFormat} ${var:appIdFormat} ${callsite:className=false:methodName=false:fileName=true:includeSourcePath=false:skipFrames=2} ${message}" />
+			layout="${longdate} ${var:appTypeFormat} ${var:appIdFormat} ${message} ${newline} ${stacktrace:format=Raw:topFrames=10:skipFrames=0}" />
 	</targets>
 	
 	<rules>

+ 1 - 1
Server/App/Program.cs

@@ -37,7 +37,7 @@ namespace App
 				LogManager.Configuration.Variables["appTypeFormat"] = $"{startConfig.AppType,-8}";
 				LogManager.Configuration.Variables["appIdFormat"] = $"{startConfig.AppId:D3}";
 
-				Log.Info("server start........................");
+				Log.Info($"server start........................ {startConfig.AppId} {startConfig.AppType}");
 
 				Game.Scene.AddComponent<OpcodeTypeComponent>();
 				Game.Scene.AddComponent<MessageDispatherComponent>();

+ 1 - 1
Server/Hotfix/Helper/MessageHelper.cs

@@ -4,7 +4,7 @@ namespace ETHotfix
 {
 	public static class MessageHelper
 	{
-		public static void Broadcast(IMessage message)
+		public static void Broadcast(IActorMessage message)
 		{
 			Unit[] units = Game.Scene.GetComponent<UnitComponent>().GetAll();
 			ActorProxyComponent actorProxyComponent = Game.Scene.GetComponent<ActorProxyComponent>();

+ 1 - 1
Server/Hotfix/Module/Actor/ActorComponentSystem.cs

@@ -108,7 +108,7 @@ namespace ETHotfix
 				{
 					ActorMessageInfo info = await self.GetAsync();
 					// 返回null表示actor已经删除,协程要终止
-					if (info == null)
+					if (info.Message == null)
 					{
 						return;
 					}

+ 15 - 26
Server/Hotfix/Module/Actor/EntityActorHandler.cs

@@ -9,22 +9,19 @@ namespace ETHotfix
     /// </summary>
     public class GateSessionEntityActorHandler : IEntityActorHandler
     {
-        public async Task Handle(Session session, Entity entity, ActorRequest actorRequest)
+        public async Task Handle(Session session, Entity entity, IActorMessage actorMessage)
         {
-			ActorResponse actorResponse = new ActorResponse();
-	        actorResponse.RpcId = actorRequest.RpcId;
-
+			ActorResponse actorResponse = new ActorResponse
+			{
+				RpcId = actorMessage.RpcId
+			};
 			try
 	        {
-		        OpcodeTypeComponent opcodeTypeComponent = session.Network.Entity.GetComponent<OpcodeTypeComponent>();
-		        Type type = opcodeTypeComponent.GetType(actorRequest.Op);
-		        IMessage message = (IMessage)session.Network.MessagePacker.DeserializeFrom(type, actorRequest.AMessage);
+		        // 发送给客户端
+		        Session clientSession = entity as Session;
+				clientSession.Send(actorMessage);
 
-				// 发送给客户端
-				Session clientSession = entity as Session;
-		        clientSession.Send(actorResponse.Flag, message);
-				
-		        session.Reply(actorResponse);
+				session.Reply(actorResponse);
 		        await Task.CompletedTask;
 	        }
 	        catch (Exception e)
@@ -39,13 +36,9 @@ namespace ETHotfix
 
     public class CommonEntityActorHandler : IEntityActorHandler
     {
-        public async Task Handle(Session session, Entity entity, ActorRequest actorRequest)
+        public async Task Handle(Session session, Entity entity, IActorMessage actorMessage)
         {
-	        OpcodeTypeComponent opcodeTypeComponent = session.Network.Entity.GetComponent<OpcodeTypeComponent>();
-	        Type type = opcodeTypeComponent.GetType(actorRequest.Op);
-	        IMessage message = (IMessage)session.Network.MessagePacker.DeserializeFrom(type, actorRequest.AMessage);
-
-			await Game.Scene.GetComponent<ActorMessageDispatherComponent>().Handle(session, entity, actorRequest, message);
+			await Game.Scene.GetComponent<ActorMessageDispatherComponent>().Handle(session, entity, actorMessage);
         }
     }
 
@@ -54,24 +47,20 @@ namespace ETHotfix
     /// </summary>
     public class MapUnitEntityActorHandler : IEntityActorHandler
     {
-        public async Task Handle(Session session, Entity entity, ActorRequest actorRequest)
+        public async Task Handle(Session session, Entity entity, IActorMessage actorMessage)
         {
-	        OpcodeTypeComponent opcodeTypeComponent = session.Network.Entity.GetComponent<OpcodeTypeComponent>();
-	        Type type = opcodeTypeComponent.GetType(actorRequest.Op);
-	        IMessage message = (IMessage)session.Network.MessagePacker.DeserializeFrom(type, actorRequest.AMessage);
-
-			if (message is OneFrameMessage aFrameMessage)
+			if (actorMessage is OneFrameMessage aFrameMessage)
             {
 				Game.Scene.GetComponent<ServerFrameComponent>().Add(aFrameMessage);
 
 				ActorResponse actorResponse = new ActorResponse
 				{
-					RpcId = actorRequest.RpcId
+					RpcId = actorMessage.RpcId
 				};
 				session.Reply(actorResponse);
 				return;
             }
-            await Game.Scene.GetComponent<ActorMessageDispatherComponent>().Handle(session, entity, actorRequest, message);
+            await Game.Scene.GetComponent<ActorMessageDispatherComponent>().Handle(session, entity, actorMessage);
         }
     }
 }

+ 0 - 1
Server/Hotfix/Module/FrameSync/C2M_TestActorRequestHandler.cs

@@ -9,7 +9,6 @@ namespace ETHotfix
 	{
 		protected override async Task Run(Unit unit, C2M_TestActorRequest message, Action<M2C_TestActorResponse> reply)
 		{
-			Log.Debug(message.Info);
 			reply(new M2C_TestActorResponse(){Info = "actor rpc response"});
 			await Task.CompletedTask;
 		}

+ 8 - 6
Server/Hotfix/Module/Message/InnerMessageDispatcher.cs

@@ -10,22 +10,24 @@ namespace ETHotfix
 			ushort opcode = packet.Opcode();
 			Type messageType = Game.Scene.GetComponent<OpcodeTypeComponent>().GetType(opcode);
 			IMessage message = (IMessage)session.Network.MessagePacker.DeserializeFrom(messageType, packet.Bytes, Packet.Index, packet.Length - Packet.Index);
-			// 收到actor rpc request
-			if (message is ActorRequest actorRpcRequest)
+			
+			// 收到actor消息,放入actor队列
+			if (message is IActorMessage iActorMessage)
 			{
-				Entity entity = Game.Scene.GetComponent<ActorManagerComponent>().Get(actorRpcRequest.Id);
+				Entity entity = Game.Scene.GetComponent<ActorManagerComponent>().Get(iActorMessage.ActorId);
 				if (entity == null)
 				{
-					Log.Warning($"not found actor: {actorRpcRequest.Id}");
+					Log.Debug($"not found actor: {iActorMessage.ActorId}");
 					ActorResponse response = new ActorResponse
 					{
-						Error = ErrorCode.ERR_NotFoundActor
+						Error = ErrorCode.ERR_NotFoundActor,
+						RpcId = iActorMessage.RpcId
 					};
 					session.Reply(response);
 					return;
 				}
 				
-				entity.GetComponent<ActorComponent>().Add(new ActorMessageInfo() { Session = session, RpcId = actorRpcRequest.RpcId, Message = actorRpcRequest });
+				entity.GetComponent<ActorComponent>().Add(new ActorMessageInfo() { Session = session, Message = iActorMessage });
 				return;
 			}
 			

+ 9 - 5
Server/Hotfix/Module/Message/OuterMessageDispatcher.cs

@@ -29,19 +29,23 @@ namespace ETHotfix
 					actorProxy.Send(oneFrameMessage);
 					return;
 				}
-				case IActorMessage _: // gate session收到actor消息直接转发给actor自己去处理
+				case IActorRequest iActorRequest: // gate session收到actor rpc消息,先向actor 发送rpc请求,再将请求结果返回客户端
 				{
 					long unitId = session.GetComponent<SessionPlayerComponent>().Player.UnitId;
 					ActorProxy actorProxy = Game.Scene.GetComponent<ActorProxyComponent>().Get(unitId);
-					actorProxy.Send((IMessage)message);
+
+					int rpcId = iActorRequest.RpcId; // 这里要保存客户端的rpcId
+					IResponse response = await actorProxy.Call(iActorRequest);
+					response.RpcId = rpcId;
+
+					session.Reply(response);
 					return;
 				}
-				case IActorRequest aActorRequest: // gate session收到actor rpc消息,先向actor 发送rpc请求,再将请求结果返回客户端
+				case IActorMessage iActorMessage: // gate session收到actor消息直接转发给actor自己去处理
 				{
 					long unitId = session.GetComponent<SessionPlayerComponent>().Player.UnitId;
 					ActorProxy actorProxy = Game.Scene.GetComponent<ActorProxyComponent>().Get(unitId);
-					IResponse response = await actorProxy.Call(aActorRequest);
-					session.Reply(response);
+					actorProxy.Send(iActorMessage);
 					return;
 				}
 			}

+ 13 - 22
Server/Model/Module/Actor/AMActorHandler.cs

@@ -7,12 +7,12 @@ namespace ETModel
 	{
 		protected abstract Task Run(E entity, Message message);
 
-		public async Task Handle(Session session, Entity entity, ActorRequest actorRequest, object message)
+		public async Task Handle(Session session, Entity entity, IActorMessage actorRequest)
 		{
-			Message msg = message as Message;
+			Message msg = actorRequest as Message;
 			if (msg == null)
 			{
-				Log.Error($"消息类型转换错误: {message.GetType().FullName} to {typeof (Message).Name}");
+				Log.Error($"消息类型转换错误: {actorRequest.GetType().FullName} to {typeof (Message).Name}");
 				return;
 			}
 			E e = entity as E;
@@ -29,7 +29,10 @@ namespace ETModel
 			{
 				return;
 			}
-			ActorResponse response = new ActorResponse();
+			ActorResponse response = new ActorResponse
+			{
+				RpcId = actorRequest.RpcId
+			};
 			session.Reply(response);
 		}
 
@@ -51,14 +54,14 @@ namespace ETModel
 
 		protected abstract Task Run(E unit, Request message, Action<Response> reply);
 
-		public async Task Handle(Session session, Entity entity, ActorRequest actorRequest, object message)
+		public async Task Handle(Session session, Entity entity, IActorMessage actorRequest)
 		{
 			try
 			{
-				Request request = message as Request;
+				Request request = actorRequest as Request;
 				if (request == null)
 				{
-					Log.Error($"消息类型转换错误: {message.GetType().FullName} to {typeof (Request).Name}");
+					Log.Error($"消息类型转换错误: {actorRequest.GetType().FullName} to {typeof (Request).Name}");
 					return;
 				}
 				E e = entity as E;
@@ -76,26 +79,14 @@ namespace ETModel
 					{
 						return;
 					}
-
 					response.RpcId = rpcId;
-
-					OpcodeTypeComponent opcodeTypeComponent = session.Network.Entity.GetComponent<OpcodeTypeComponent>();
-					ushort opcode = opcodeTypeComponent.GetOpcode(response.GetType());
-					byte[] repsponseBytes = session.Network.MessagePacker.SerializeToByteArray(response);
-
-					ActorResponse actorResponse = new ActorResponse
-					{
-						Flag = 0x01,
-						Op = opcode,
-						AMessage = repsponseBytes
-					};
-					actorResponse.RpcId = actorRequest.RpcId;
-					session.Reply(actorResponse);
+					
+					session.Reply(response);
 				});
 			}
 			catch (Exception e)
 			{
-				throw new Exception($"解释消息失败: {message.GetType().FullName}", e);
+				throw new Exception($"解释消息失败: {actorRequest.GetType().FullName}", e);
 			}
 		}
 

+ 3 - 4
Server/Model/Module/Actor/ActorComponent.cs

@@ -4,11 +4,10 @@ using System.Threading.Tasks;
 
 namespace ETModel
 {
-	public class ActorMessageInfo
+	public struct ActorMessageInfo
 	{
 		public Session Session;
-		public int RpcId;
-		public ActorRequest Message;
+		public IActorMessage Message;
 	}
 
 	/// <summary>
@@ -38,7 +37,7 @@ namespace ETModel
 
 				var t = this.tcs;
 				this.tcs = null;
-				t?.SetResult(null);
+				t?.SetResult(new ActorMessageInfo());
 
 				Game.Scene.GetComponent<ActorManagerComponent>().Remove(actorId);
 			}

+ 7 - 0
Server/Model/Module/Actor/ActorManagerComponent.cs

@@ -24,11 +24,18 @@ namespace ETModel
 
 		public void Add(Entity entity)
 		{
+			Log.Info($"add actor: {entity.Id} {entity.GetType().Name}");
 			dictionary[entity.Id] = entity;
 		}
 
 		public void Remove(long id)
 		{
+			Entity entity;
+			if (!this.dictionary.TryGetValue(id, out entity))
+			{
+				return;
+			}
+			Log.Info($"remove actor: {entity.Id} {entity.GetType().Name}");
 			this.dictionary.Remove(id);
 		}
 

+ 4 - 4
Server/Model/Module/Actor/ActorMessageDispatherComponent.cs

@@ -75,14 +75,14 @@ namespace ETModel
 			return actorHandler;
 		}
 
-		public async Task Handle(Session session, Entity entity, ActorRequest actorRequest, IMessage message)
+		public async Task Handle(Session session, Entity entity, IActorMessage actorRequest)
 		{
-			if (!this.handlers.TryGetValue(message.GetType(), out IMActorHandler handler))
+			if (!this.handlers.TryGetValue(actorRequest.GetType(), out IMActorHandler handler))
 			{
-				throw new Exception($"not found message handler: {MongoHelper.ToJson(message)}");
+				throw new Exception($"not found message handler: {MongoHelper.ToJson(actorRequest)}");
 			}
 			
-			await handler.Handle(session, entity, actorRequest, message);
+			await handler.Handle(session, entity, actorRequest);
 		}
 
 		public override void Dispose()

+ 9 - 14
Server/Model/Module/Actor/ActorProxy.cs

@@ -18,9 +18,12 @@ namespace ETModel
 	[ObjectSystem]
 	public class ActorProxyStartSystem : StartSystem<ActorProxy>
 	{
-		public override void Start(ActorProxy self)
+		public override async void Start(ActorProxy self)
 		{
-			self.Start();
+			int appId = await Game.Scene.GetComponent<LocationProxyComponent>().Get(self.Id);
+			self.Address = Game.Scene.GetComponent<StartConfigComponent>().Get(appId).GetComponent<InnerConfig>().IPEndPoint;
+
+			self.UpdateAsync();
 		}
 	}
 
@@ -75,15 +78,7 @@ namespace ETModel
 			this.tcs = null;
 			t?.SetResult(new ActorTask());
 		}
-
-		public async void Start()
-		{
-			int appId = await Game.Scene.GetComponent<LocationProxyComponent>().Get(this.Id);
-			this.Address = Game.Scene.GetComponent<StartConfigComponent>().Get(appId).GetComponent<InnerConfig>().IPEndPoint;
-
-			this.UpdateAsync();
-		}
-
+		
 		private void Add(ActorTask task)
 		{
 			if (this.IsDisposed)
@@ -126,7 +121,7 @@ namespace ETModel
 			return this.tcs.Task;
 		}
 
-		private async void UpdateAsync()
+		public async void UpdateAsync()
 		{
 			while (true)
 			{
@@ -206,7 +201,7 @@ namespace ETModel
 			}
 		}
 
-		public void Send(IMessage message)
+		public void Send(IActorMessage message)
 		{
 			ActorTask task = new ActorTask
 			{
@@ -216,7 +211,7 @@ namespace ETModel
 			this.Add(task);
 		}
 
-		public Task<IResponse> Call(IRequest request)
+		public Task<IResponse> Call(IActorRequest request)
 		{
 			ActorTask task = new ActorTask
 			{

+ 0 - 53
Server/Model/Module/Actor/ActorRequestWrap.cs

@@ -1,53 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-using ProtoBuf;
-
-namespace ETModel
-{
-	/// <summary>
-	/// 用来包装actor消息
-	/// </summary>
-	[Message(Opcode.ActorRequest)]
-	[ProtoContract]
-	public partial class ActorRequest : IRequest
-	{
-		[ProtoMember(90, IsRequired = true)]
-		public int RpcId { get; set; }
-
-		[ProtoMember(1, IsRequired = true)]
-		public long Id { get; set; }
-
-		[ProtoMember(2, IsRequired = true)]
-		public ushort Op { get; set; }
-
-		[ProtoMember(3, IsRequired = true)]
-		public byte[] AMessage { get; set; }
-	}
-
-	/// <summary>
-	/// actor RPC消息响应
-	/// </summary>
-	[Message(Opcode.ActorResponse)]
-	[ProtoContract]
-	public partial class ActorResponse : IResponse
-	{
-		[ProtoMember(90, IsRequired = true)]
-		public int Error { get; set; }
-
-		[ProtoMember(91, IsRequired = true)]
-		public string Message { get; set; }
-
-		[ProtoMember(92, IsRequired = true)]
-		public int RpcId { get; set; }
-
-		[ProtoMember(1, IsRequired = true)]
-		public byte Flag { get; set; }
-
-		[ProtoMember(2, IsRequired = true)]
-		public ushort Op { get; set; }
-
-		[ProtoMember(3, IsRequired = true)]
-		public byte[] AMessage { get; set; }
-	}
-}

+ 23 - 0
Server/Model/Module/Actor/ActorResponse.cs

@@ -0,0 +1,23 @@
+using System;
+using System.Collections.Generic;
+using ProtoBuf;
+
+namespace ETModel
+{
+	/// <summary>
+	/// actor RPC消息响应
+	/// </summary>
+	[Message(Opcode.ActorResponse)]
+	[ProtoContract]
+	public class ActorResponse : IActorResponse
+	{
+		[ProtoMember(90, IsRequired = true)]
+		public int RpcId { get; set; }
+
+		[ProtoMember(91, IsRequired = true)]
+		public int Error { get; set; }
+
+		[ProtoMember(92, IsRequired = true)]
+		public string Message { get; set; }
+	}
+}

+ 6 - 14
Server/Model/Module/Actor/ActorTask.cs

@@ -1,5 +1,4 @@
-using System;
-using System.Threading.Tasks;
+using System.Threading.Tasks;
 
 namespace ETModel
 {
@@ -7,32 +6,25 @@ namespace ETModel
 	{
 		public ActorProxy proxy;
 		
-		public IMessage message;
+		public IActorMessage message;
 		
 		public TaskCompletionSource<IResponse> Tcs;
 
 		public async Task<IResponse> Run()
 		{
 			Session session = Game.Scene.GetComponent<NetInnerComponent>().Get(this.proxy.Address);
-			OpcodeTypeComponent opcodeTypeComponent = session.Network.Entity.GetComponent<OpcodeTypeComponent>();
 
-			ushort opcode = opcodeTypeComponent.GetOpcode(message.GetType());
-			byte[] requestBytes = session.Network.MessagePacker.SerializeToByteArray(message);
+			this.message.ActorId = this.proxy.Id;
+			IResponse response = await session.Call(message, this.proxy.CancellationTokenSource.Token);
 
-			ActorRequest actorRequest = new ActorRequest() { Id = this.proxy.Id, Op = opcode, AMessage = requestBytes };
-
-			ActorResponse actorResponse = (ActorResponse)await session.Call(actorRequest, this.proxy.CancellationTokenSource.Token);
-			
-			if (actorResponse.Error != ErrorCode.ERR_NotFoundActor)
+			if (response.Error != ErrorCode.ERR_NotFoundActor)
 			{
 				if (this.Tcs != null)
 				{
-					Type type = opcodeTypeComponent.GetType(actorResponse.Op);
-					IResponse response = (IResponse) session.Network.MessagePacker.DeserializeFrom(type, actorResponse.AMessage);
 					this.Tcs?.SetResult(response);
 				}
 			}
-			return actorResponse;
+			return response;
 		}
 
 		public void RunFail(int error)

+ 1 - 1
Server/Model/Module/Actor/IEntityActorHandler.cs

@@ -4,6 +4,6 @@ namespace ETModel
 {
 	public interface IEntityActorHandler
 	{
-		Task Handle(Session session, Entity entity, ActorRequest message);
+		Task Handle(Session session, Entity entity, IActorMessage actorMessage);
 	}
 }

+ 1 - 1
Server/Model/Module/Actor/IMActorHandler.cs

@@ -5,7 +5,7 @@ namespace ETModel
 {
 	public interface IMActorHandler
 	{
-		Task Handle(Session session, Entity entity, ActorRequest actorRequest, object message);
+		Task Handle(Session session, Entity entity, IActorMessage actorRequest);
 		Type GetMessageType();
 	}
 }

+ 31 - 12
Server/Model/Module/Message/HotfixMessage.cs

@@ -10,6 +10,7 @@ namespace ETModel
 	{
 		[ProtoMember(90, IsRequired = true)]
 		public int RpcId { get; set; }
+
 		[ProtoMember(1, IsRequired = true)]
 		public string Account;
 
@@ -23,11 +24,14 @@ namespace ETModel
 	public partial class R2C_Login: IResponse
 	{
 		[ProtoMember(90, IsRequired = true)]
-		public int Error { get; set; }
+		public int RpcId { get; set; }
+
 		[ProtoMember(91, IsRequired = true)]
-		public string Message { get; set; }
+		public int Error { get; set; }
+
 		[ProtoMember(92, IsRequired = true)]
-		public int RpcId { get; set; }
+		public string Message { get; set; }
+
 		[ProtoMember(1, IsRequired = true)]
 		public string Address;
 
@@ -42,6 +46,7 @@ namespace ETModel
 	{
 		[ProtoMember(90, IsRequired = true)]
 		public int RpcId { get; set; }
+
 		[ProtoMember(1, IsRequired = true)]
 		public long Key;
 
@@ -52,11 +57,14 @@ namespace ETModel
 	public partial class G2C_LoginGate: IResponse
 	{
 		[ProtoMember(90, IsRequired = true)]
-		public int Error { get; set; }
+		public int RpcId { get; set; }
+
 		[ProtoMember(91, IsRequired = true)]
-		public string Message { get; set; }
+		public int Error { get; set; }
+
 		[ProtoMember(92, IsRequired = true)]
-		public int RpcId { get; set; }
+		public string Message { get; set; }
+
 		[ProtoMember(1, IsRequired = true)]
 		public long PlayerId;
 
@@ -77,6 +85,10 @@ namespace ETModel
 	{
 		[ProtoMember(90, IsRequired = true)]
 		public int RpcId { get; set; }
+
+		[ProtoMember(93, IsRequired = true)]
+		public long ActorId { get; set; }
+
 		[ProtoMember(1, IsRequired = true)]
 		public string Info;
 
@@ -87,11 +99,14 @@ namespace ETModel
 	public partial class M2C_TestActorResponse: IActorResponse
 	{
 		[ProtoMember(90, IsRequired = true)]
-		public int Error { get; set; }
+		public int RpcId { get; set; }
+
 		[ProtoMember(91, IsRequired = true)]
-		public string Message { get; set; }
+		public int Error { get; set; }
+
 		[ProtoMember(92, IsRequired = true)]
-		public int RpcId { get; set; }
+		public string Message { get; set; }
+
 		[ProtoMember(1, IsRequired = true)]
 		public string Info;
 
@@ -109,6 +124,7 @@ namespace ETModel
 	{
 		[ProtoMember(90, IsRequired = true)]
 		public int RpcId { get; set; }
+
 	}
 
 	[Message(HotfixOpcode.G2C_PlayerInfo)]
@@ -116,11 +132,14 @@ namespace ETModel
 	public partial class G2C_PlayerInfo: IResponse
 	{
 		[ProtoMember(90, IsRequired = true)]
-		public int Error { get; set; }
+		public int RpcId { get; set; }
+
 		[ProtoMember(91, IsRequired = true)]
-		public string Message { get; set; }
+		public int Error { get; set; }
+
 		[ProtoMember(92, IsRequired = true)]
-		public int RpcId { get; set; }
+		public string Message { get; set; }
+
 		[ProtoMember(1)]
 		public List<PlayerInfo> PlayerInfos = new List<PlayerInfo>();
 

+ 112 - 48
Server/Model/Module/Message/InnerMessage.cs

@@ -13,6 +13,7 @@ namespace ETModel
 	{
 		[ProtoMember(90, IsRequired = true)]
 		public int RpcId { get; set; }
+
 		[ProtoMember(1, IsRequired = true)]
 		public Unit Unit;
 
@@ -23,11 +24,14 @@ namespace ETModel
 	public partial class M2M_TrasferUnitResponse: IResponse
 	{
 		[ProtoMember(90, IsRequired = true)]
-		public int Error { get; set; }
+		public int RpcId { get; set; }
+
 		[ProtoMember(91, IsRequired = true)]
-		public string Message { get; set; }
+		public int Error { get; set; }
+
 		[ProtoMember(92, IsRequired = true)]
-		public int RpcId { get; set; }
+		public string Message { get; set; }
+
 	}
 
 	[Message(InnerOpcode.M2A_Reload)]
@@ -36,6 +40,7 @@ namespace ETModel
 	{
 		[ProtoMember(90, IsRequired = true)]
 		public int RpcId { get; set; }
+
 	}
 
 	[Message(InnerOpcode.A2M_Reload)]
@@ -43,11 +48,14 @@ namespace ETModel
 	public partial class A2M_Reload: IResponse
 	{
 		[ProtoMember(90, IsRequired = true)]
-		public int Error { get; set; }
+		public int RpcId { get; set; }
+
 		[ProtoMember(91, IsRequired = true)]
-		public string Message { get; set; }
+		public int Error { get; set; }
+
 		[ProtoMember(92, IsRequired = true)]
-		public int RpcId { get; set; }
+		public string Message { get; set; }
+
 	}
 
 	[Message(InnerOpcode.G2G_LockRequest)]
@@ -56,6 +64,7 @@ namespace ETModel
 	{
 		[ProtoMember(90, IsRequired = true)]
 		public int RpcId { get; set; }
+
 		[ProtoMember(1, IsRequired = true)]
 		public long Id;
 
@@ -69,11 +78,14 @@ namespace ETModel
 	public partial class G2G_LockResponse: IResponse
 	{
 		[ProtoMember(90, IsRequired = true)]
-		public int Error { get; set; }
+		public int RpcId { get; set; }
+
 		[ProtoMember(91, IsRequired = true)]
-		public string Message { get; set; }
+		public int Error { get; set; }
+
 		[ProtoMember(92, IsRequired = true)]
-		public int RpcId { get; set; }
+		public string Message { get; set; }
+
 	}
 
 	[Message(InnerOpcode.G2G_LockReleaseRequest)]
@@ -82,6 +94,7 @@ namespace ETModel
 	{
 		[ProtoMember(90, IsRequired = true)]
 		public int RpcId { get; set; }
+
 		[ProtoMember(1, IsRequired = true)]
 		public long Id;
 
@@ -95,11 +108,14 @@ namespace ETModel
 	public partial class G2G_LockReleaseResponse: IResponse
 	{
 		[ProtoMember(90, IsRequired = true)]
-		public int Error { get; set; }
+		public int RpcId { get; set; }
+
 		[ProtoMember(91, IsRequired = true)]
-		public string Message { get; set; }
+		public int Error { get; set; }
+
 		[ProtoMember(92, IsRequired = true)]
-		public int RpcId { get; set; }
+		public string Message { get; set; }
+
 	}
 
 	[Message(InnerOpcode.DBSaveRequest)]
@@ -108,6 +124,7 @@ namespace ETModel
 	{
 		[ProtoMember(90, IsRequired = true)]
 		public int RpcId { get; set; }
+
 		[ProtoMember(1, IsRequired = true)]
 		public bool NeedCache;
 
@@ -124,11 +141,14 @@ namespace ETModel
 	public partial class DBSaveBatchResponse: IResponse
 	{
 		[ProtoMember(90, IsRequired = true)]
-		public int Error { get; set; }
+		public int RpcId { get; set; }
+
 		[ProtoMember(91, IsRequired = true)]
-		public string Message { get; set; }
+		public int Error { get; set; }
+
 		[ProtoMember(92, IsRequired = true)]
-		public int RpcId { get; set; }
+		public string Message { get; set; }
+
 	}
 
 	[Message(InnerOpcode.DBSaveBatchRequest)]
@@ -137,6 +157,7 @@ namespace ETModel
 	{
 		[ProtoMember(90, IsRequired = true)]
 		public int RpcId { get; set; }
+
 		[ProtoMember(1, IsRequired = true)]
 		public bool NeedCache;
 
@@ -153,11 +174,14 @@ namespace ETModel
 	public partial class DBSaveResponse: IResponse
 	{
 		[ProtoMember(90, IsRequired = true)]
-		public int Error { get; set; }
+		public int RpcId { get; set; }
+
 		[ProtoMember(91, IsRequired = true)]
-		public string Message { get; set; }
+		public int Error { get; set; }
+
 		[ProtoMember(92, IsRequired = true)]
-		public int RpcId { get; set; }
+		public string Message { get; set; }
+
 	}
 
 	[Message(InnerOpcode.DBQueryRequest)]
@@ -166,6 +190,7 @@ namespace ETModel
 	{
 		[ProtoMember(90, IsRequired = true)]
 		public int RpcId { get; set; }
+
 		[ProtoMember(1, IsRequired = true)]
 		public long Id;
 
@@ -182,11 +207,14 @@ namespace ETModel
 	public partial class DBQueryResponse: IResponse
 	{
 		[ProtoMember(90, IsRequired = true)]
-		public int Error { get; set; }
+		public int RpcId { get; set; }
+
 		[ProtoMember(91, IsRequired = true)]
-		public string Message { get; set; }
+		public int Error { get; set; }
+
 		[ProtoMember(92, IsRequired = true)]
-		public int RpcId { get; set; }
+		public string Message { get; set; }
+
 		[ProtoMember(1, IsRequired = true)]
 		public Component Disposer;
 
@@ -198,6 +226,7 @@ namespace ETModel
 	{
 		[ProtoMember(90, IsRequired = true)]
 		public int RpcId { get; set; }
+
 		[ProtoMember(1, IsRequired = true)]
 		public string CollectionName;
 
@@ -214,11 +243,14 @@ namespace ETModel
 	public partial class DBQueryBatchResponse: IResponse
 	{
 		[ProtoMember(90, IsRequired = true)]
-		public int Error { get; set; }
+		public int RpcId { get; set; }
+
 		[ProtoMember(91, IsRequired = true)]
-		public string Message { get; set; }
+		public int Error { get; set; }
+
 		[ProtoMember(92, IsRequired = true)]
-		public int RpcId { get; set; }
+		public string Message { get; set; }
+
 		[ProtoMember(1)]
 		public List<Component> Disposers = new List<Component>();
 
@@ -230,6 +262,7 @@ namespace ETModel
 	{
 		[ProtoMember(90, IsRequired = true)]
 		public int RpcId { get; set; }
+
 		[ProtoMember(1, IsRequired = true)]
 		public string CollectionName;
 
@@ -246,11 +279,14 @@ namespace ETModel
 	public partial class DBQueryJsonResponse: IResponse
 	{
 		[ProtoMember(90, IsRequired = true)]
-		public int Error { get; set; }
+		public int RpcId { get; set; }
+
 		[ProtoMember(91, IsRequired = true)]
-		public string Message { get; set; }
+		public int Error { get; set; }
+
 		[ProtoMember(92, IsRequired = true)]
-		public int RpcId { get; set; }
+		public string Message { get; set; }
+
 		[ProtoMember(1)]
 		public List<Component> Disposers = new List<Component>();
 
@@ -262,6 +298,7 @@ namespace ETModel
 	{
 		[ProtoMember(90, IsRequired = true)]
 		public int RpcId { get; set; }
+
 		[ProtoMember(1, IsRequired = true)]
 		public long Key;
 
@@ -275,11 +312,14 @@ namespace ETModel
 	public partial class ObjectAddResponse: IResponse
 	{
 		[ProtoMember(90, IsRequired = true)]
-		public int Error { get; set; }
+		public int RpcId { get; set; }
+
 		[ProtoMember(91, IsRequired = true)]
-		public string Message { get; set; }
+		public int Error { get; set; }
+
 		[ProtoMember(92, IsRequired = true)]
-		public int RpcId { get; set; }
+		public string Message { get; set; }
+
 	}
 
 	[Message(InnerOpcode.ObjectRemoveRequest)]
@@ -288,6 +328,7 @@ namespace ETModel
 	{
 		[ProtoMember(90, IsRequired = true)]
 		public int RpcId { get; set; }
+
 		[ProtoMember(1, IsRequired = true)]
 		public long Key;
 
@@ -298,11 +339,14 @@ namespace ETModel
 	public partial class ObjectRemoveResponse: IResponse
 	{
 		[ProtoMember(90, IsRequired = true)]
-		public int Error { get; set; }
+		public int RpcId { get; set; }
+
 		[ProtoMember(91, IsRequired = true)]
-		public string Message { get; set; }
+		public int Error { get; set; }
+
 		[ProtoMember(92, IsRequired = true)]
-		public int RpcId { get; set; }
+		public string Message { get; set; }
+
 	}
 
 	[Message(InnerOpcode.ObjectLockRequest)]
@@ -311,6 +355,7 @@ namespace ETModel
 	{
 		[ProtoMember(90, IsRequired = true)]
 		public int RpcId { get; set; }
+
 		[ProtoMember(1, IsRequired = true)]
 		public long Key;
 
@@ -327,11 +372,14 @@ namespace ETModel
 	public partial class ObjectLockResponse: IResponse
 	{
 		[ProtoMember(90, IsRequired = true)]
-		public int Error { get; set; }
+		public int RpcId { get; set; }
+
 		[ProtoMember(91, IsRequired = true)]
-		public string Message { get; set; }
+		public int Error { get; set; }
+
 		[ProtoMember(92, IsRequired = true)]
-		public int RpcId { get; set; }
+		public string Message { get; set; }
+
 	}
 
 	[Message(InnerOpcode.ObjectUnLockRequest)]
@@ -340,6 +388,7 @@ namespace ETModel
 	{
 		[ProtoMember(90, IsRequired = true)]
 		public int RpcId { get; set; }
+
 		[ProtoMember(1, IsRequired = true)]
 		public long Key;
 
@@ -356,11 +405,14 @@ namespace ETModel
 	public partial class ObjectUnLockResponse: IResponse
 	{
 		[ProtoMember(90, IsRequired = true)]
-		public int Error { get; set; }
+		public int RpcId { get; set; }
+
 		[ProtoMember(91, IsRequired = true)]
-		public string Message { get; set; }
+		public int Error { get; set; }
+
 		[ProtoMember(92, IsRequired = true)]
-		public int RpcId { get; set; }
+		public string Message { get; set; }
+
 	}
 
 	[Message(InnerOpcode.ObjectGetRequest)]
@@ -369,6 +421,7 @@ namespace ETModel
 	{
 		[ProtoMember(90, IsRequired = true)]
 		public int RpcId { get; set; }
+
 		[ProtoMember(1, IsRequired = true)]
 		public long Key;
 
@@ -379,11 +432,14 @@ namespace ETModel
 	public partial class ObjectGetResponse: IResponse
 	{
 		[ProtoMember(90, IsRequired = true)]
-		public int Error { get; set; }
+		public int RpcId { get; set; }
+
 		[ProtoMember(91, IsRequired = true)]
-		public string Message { get; set; }
+		public int Error { get; set; }
+
 		[ProtoMember(92, IsRequired = true)]
-		public int RpcId { get; set; }
+		public string Message { get; set; }
+
 		[ProtoMember(1, IsRequired = true)]
 		public int AppId;
 
@@ -395,6 +451,7 @@ namespace ETModel
 	{
 		[ProtoMember(90, IsRequired = true)]
 		public int RpcId { get; set; }
+
 		[ProtoMember(1, IsRequired = true)]
 		public string Account;
 
@@ -405,11 +462,14 @@ namespace ETModel
 	public partial class G2R_GetLoginKey: IResponse
 	{
 		[ProtoMember(90, IsRequired = true)]
-		public int Error { get; set; }
+		public int RpcId { get; set; }
+
 		[ProtoMember(91, IsRequired = true)]
-		public string Message { get; set; }
+		public int Error { get; set; }
+
 		[ProtoMember(92, IsRequired = true)]
-		public int RpcId { get; set; }
+		public string Message { get; set; }
+
 		[ProtoMember(1, IsRequired = true)]
 		public long Key;
 
@@ -421,6 +481,7 @@ namespace ETModel
 	{
 		[ProtoMember(90, IsRequired = true)]
 		public int RpcId { get; set; }
+
 		[ProtoMember(1, IsRequired = true)]
 		public long PlayerId;
 
@@ -434,11 +495,14 @@ namespace ETModel
 	public partial class M2G_CreateUnit: IResponse
 	{
 		[ProtoMember(90, IsRequired = true)]
-		public int Error { get; set; }
+		public int RpcId { get; set; }
+
 		[ProtoMember(91, IsRequired = true)]
-		public string Message { get; set; }
+		public int Error { get; set; }
+
 		[ProtoMember(92, IsRequired = true)]
-		public int RpcId { get; set; }
+		public string Message { get; set; }
+
 		[ProtoMember(1, IsRequired = true)]
 		public long UnitId;
 

+ 61 - 16
Server/Model/Module/Message/OuterMessage.cs

@@ -8,6 +8,12 @@ namespace ETModel
 	[ProtoContract]
 	public partial class Actor_Test: IActorMessage
 	{
+		[ProtoMember(90, IsRequired = true)]
+		public int RpcId { get; set; }
+
+		[ProtoMember(93, IsRequired = true)]
+		public long ActorId { get; set; }
+
 		[ProtoMember(1, IsRequired = true)]
 		public string Info;
 
@@ -19,6 +25,10 @@ namespace ETModel
 	{
 		[ProtoMember(90, IsRequired = true)]
 		public int RpcId { get; set; }
+
+		[ProtoMember(93, IsRequired = true)]
+		public long ActorId { get; set; }
+
 		[ProtoMember(1, IsRequired = true)]
 		public string request;
 
@@ -29,11 +39,14 @@ namespace ETModel
 	public partial class Actor_TestResponse: IActorResponse
 	{
 		[ProtoMember(90, IsRequired = true)]
-		public int Error { get; set; }
+		public int RpcId { get; set; }
+
 		[ProtoMember(91, IsRequired = true)]
-		public string Message { get; set; }
+		public int Error { get; set; }
+
 		[ProtoMember(92, IsRequired = true)]
-		public int RpcId { get; set; }
+		public string Message { get; set; }
+
 		[ProtoMember(1, IsRequired = true)]
 		public string response;
 
@@ -45,6 +58,10 @@ namespace ETModel
 	{
 		[ProtoMember(90, IsRequired = true)]
 		public int RpcId { get; set; }
+
+		[ProtoMember(93, IsRequired = true)]
+		public long ActorId { get; set; }
+
 		[ProtoMember(1, IsRequired = true)]
 		public int MapIndex;
 
@@ -55,11 +72,14 @@ namespace ETModel
 	public partial class Actor_TransferResponse: IActorResponse
 	{
 		[ProtoMember(90, IsRequired = true)]
-		public int Error { get; set; }
+		public int RpcId { get; set; }
+
 		[ProtoMember(91, IsRequired = true)]
-		public string Message { get; set; }
+		public int Error { get; set; }
+
 		[ProtoMember(92, IsRequired = true)]
-		public int RpcId { get; set; }
+		public string Message { get; set; }
+
 	}
 
 	[Message(OuterOpcode.C2G_EnterMap)]
@@ -68,6 +88,7 @@ namespace ETModel
 	{
 		[ProtoMember(90, IsRequired = true)]
 		public int RpcId { get; set; }
+
 	}
 
 	[Message(OuterOpcode.G2C_EnterMap)]
@@ -75,11 +96,14 @@ namespace ETModel
 	public partial class G2C_EnterMap: IResponse
 	{
 		[ProtoMember(90, IsRequired = true)]
-		public int Error { get; set; }
+		public int RpcId { get; set; }
+
 		[ProtoMember(91, IsRequired = true)]
-		public string Message { get; set; }
+		public int Error { get; set; }
+
 		[ProtoMember(92, IsRequired = true)]
-		public int RpcId { get; set; }
+		public string Message { get; set; }
+
 		[ProtoMember(1, IsRequired = true)]
 		public long UnitId;
 
@@ -107,6 +131,12 @@ namespace ETModel
 	[ProtoContract]
 	public partial class Actor_CreateUnits: IActorMessage
 	{
+		[ProtoMember(90, IsRequired = true)]
+		public int RpcId { get; set; }
+
+		[ProtoMember(93, IsRequired = true)]
+		public long ActorId { get; set; }
+
 		[ProtoMember(1)]
 		public List<UnitInfo> Units = new List<UnitInfo>();
 
@@ -116,8 +146,15 @@ namespace ETModel
 	[ProtoContract]
 	public partial class Frame_ClickMap: IFrameMessage
 	{
-		[ProtoMember(92, IsRequired = true)]
+		[ProtoMember(90, IsRequired = true)]
+		public int RpcId { get; set; }
+
+		[ProtoMember(93, IsRequired = true)]
+		public long ActorId { get; set; }
+
+		[ProtoMember(94, IsRequired = true)]
 		public long Id { get; set; }
+
 		[ProtoMember(1, IsRequired = true)]
 		public int X;
 
@@ -132,6 +169,7 @@ namespace ETModel
 	{
 		[ProtoMember(90, IsRequired = true)]
 		public int RpcId { get; set; }
+
 		[ProtoMember(1, IsRequired = true)]
 		public AppType AppType;
 
@@ -142,11 +180,14 @@ namespace ETModel
 	public partial class M2C_Reload: IResponse
 	{
 		[ProtoMember(90, IsRequired = true)]
-		public int Error { get; set; }
+		public int RpcId { get; set; }
+
 		[ProtoMember(91, IsRequired = true)]
-		public string Message { get; set; }
+		public int Error { get; set; }
+
 		[ProtoMember(92, IsRequired = true)]
-		public int RpcId { get; set; }
+		public string Message { get; set; }
+
 	}
 
 	[Message(OuterOpcode.C2R_Ping)]
@@ -155,6 +196,7 @@ namespace ETModel
 	{
 		[ProtoMember(90, IsRequired = true)]
 		public int RpcId { get; set; }
+
 	}
 
 	[Message(OuterOpcode.R2C_Ping)]
@@ -162,11 +204,14 @@ namespace ETModel
 	public partial class R2C_Ping: IResponse
 	{
 		[ProtoMember(90, IsRequired = true)]
-		public int Error { get; set; }
+		public int RpcId { get; set; }
+
 		[ProtoMember(91, IsRequired = true)]
-		public string Message { get; set; }
+		public int Error { get; set; }
+
 		[ProtoMember(92, IsRequired = true)]
-		public int RpcId { get; set; }
+		public string Message { get; set; }
+
 	}
 
 }

+ 14 - 8
Unity/Assets/Editor/Proto2CsEditor/Proto2CSEditor.cs

@@ -123,27 +123,33 @@ namespace MyEditor
 				if (isMsgStart && newline == "{")
 				{
 					sb.Append("\t{\n");
-
-					if (parentClass == "IRequest" || parentClass == "IActorRequest")
+					
+					if (parentClass == "IRequest" || parentClass == "IActorRequest" || parentClass == "IActorMessage" || parentClass == "IFrameMessage")
 					{
 						sb.AppendLine("\t\t[ProtoMember(90, IsRequired = true)]");
-						sb.AppendLine("\t\tpublic int RpcId { get; set; }");
+						sb.AppendLine("\t\tpublic int RpcId { get; set; }\n");
 					}
 
 					if (parentClass == "IResponse" || parentClass == "IActorResponse")
 					{
 						sb.AppendLine("\t\t[ProtoMember(90, IsRequired = true)]");
-						sb.AppendLine("\t\tpublic int Error { get; set; }");
+						sb.AppendLine("\t\tpublic int RpcId { get; set; }\n");
 						sb.AppendLine("\t\t[ProtoMember(91, IsRequired = true)]");
-						sb.AppendLine("\t\tpublic string Message { get; set; }");
+						sb.AppendLine("\t\tpublic int Error { get; set; }\n");
 						sb.AppendLine("\t\t[ProtoMember(92, IsRequired = true)]");
-						sb.AppendLine("\t\tpublic int RpcId { get; set; }");
+						sb.AppendLine("\t\tpublic string Message { get; set; }\n");
+					}
+
+					if (parentClass == "IActorRequest" || parentClass == "IActorMessage" || parentClass == "IFrameMessage")
+					{
+						sb.AppendLine("\t\t[ProtoMember(93, IsRequired = true)]");
+						sb.AppendLine("\t\tpublic long ActorId { get; set; }\n");
 					}
 
 					if (parentClass == "IFrameMessage")
 					{
-						sb.AppendLine("\t\t[ProtoMember(92, IsRequired = true)]");
-						sb.AppendLine("\t\tpublic long Id { get; set; }");
+						sb.AppendLine("\t\t[ProtoMember(94, IsRequired = true)]");
+						sb.AppendLine("\t\tpublic long Id { get; set; }\n");
 					}
 				}
 

+ 11 - 1
Unity/Assets/Scripts/Module/FrameSync/FrameMessage.cs

@@ -5,8 +5,13 @@ namespace ETModel
 {
 	[Message(Opcode.OneFrameMessage)]
 	[ProtoContract]
-	public class OneFrameMessage: IMessage
+	public class OneFrameMessage: IActorMessage
 	{
+		[ProtoMember(90)]
+		public int RpcId { get; set; }
+		[ProtoMember(93)]
+		public long ActorId { get; set; }
+
 		[ProtoMember(1, IsRequired = true)]
 		public ushort Op;
 
@@ -18,6 +23,11 @@ namespace ETModel
 	[ProtoContract]
 	public partial class FrameMessage : IActorMessage
 	{
+		[ProtoMember(90)]
+		public int RpcId { get; set; }
+		[ProtoMember(93)]
+		public long ActorId { get; set; }
+
 		[ProtoMember(1, IsRequired = true)]
 		public int Frame;
 

+ 4 - 5
Unity/Assets/Scripts/Module/Message/IActorMessage.cs

@@ -1,16 +1,15 @@
-using System.Collections.Generic;
-using MongoDB.Bson.Serialization.Attributes;
-using ProtoBuf;
+using ProtoBuf;
 
 // 不要在这个文件加[ProtoInclude]跟[BsonKnowType]标签,加到InnerMessage.cs或者OuterMessage.cs里面去
 namespace ETModel
 {
-	public interface IActorMessage: IMessage
+	public interface IActorMessage: IRequest
 	{
+		long ActorId { get; set; }
 	}
 
 	[ProtoContract]
-	public interface IActorRequest : IRequest
+	public interface IActorRequest : IActorMessage
 	{
 	}
 

+ 1 - 1
Unity/Assets/Scripts/Module/Message/MessageDispatherComponent.cs

@@ -79,7 +79,7 @@ namespace ETModel
 			List<IMHandler> actions;
 			if (!this.handlers.TryGetValue(messageInfo.Opcode, out actions))
 			{
-				Log.Error($"消息 {messageInfo.Opcode} 没有处理");
+				Log.Error($"消息没有处理: {messageInfo.Opcode} {JsonHelper.ToJson(messageInfo.Message)}");
 				return;
 			}
 			

+ 61 - 16
Unity/Assets/Scripts/Module/Message/OuterMessage.cs

@@ -8,6 +8,12 @@ namespace ETModel
 	[ProtoContract]
 	public partial class Actor_Test: IActorMessage
 	{
+		[ProtoMember(90, IsRequired = true)]
+		public int RpcId { get; set; }
+
+		[ProtoMember(93, IsRequired = true)]
+		public long ActorId { get; set; }
+
 		[ProtoMember(1, IsRequired = true)]
 		public string Info;
 
@@ -19,6 +25,10 @@ namespace ETModel
 	{
 		[ProtoMember(90, IsRequired = true)]
 		public int RpcId { get; set; }
+
+		[ProtoMember(93, IsRequired = true)]
+		public long ActorId { get; set; }
+
 		[ProtoMember(1, IsRequired = true)]
 		public string request;
 
@@ -29,11 +39,14 @@ namespace ETModel
 	public partial class Actor_TestResponse: IActorResponse
 	{
 		[ProtoMember(90, IsRequired = true)]
-		public int Error { get; set; }
+		public int RpcId { get; set; }
+
 		[ProtoMember(91, IsRequired = true)]
-		public string Message { get; set; }
+		public int Error { get; set; }
+
 		[ProtoMember(92, IsRequired = true)]
-		public int RpcId { get; set; }
+		public string Message { get; set; }
+
 		[ProtoMember(1, IsRequired = true)]
 		public string response;
 
@@ -45,6 +58,10 @@ namespace ETModel
 	{
 		[ProtoMember(90, IsRequired = true)]
 		public int RpcId { get; set; }
+
+		[ProtoMember(93, IsRequired = true)]
+		public long ActorId { get; set; }
+
 		[ProtoMember(1, IsRequired = true)]
 		public int MapIndex;
 
@@ -55,11 +72,14 @@ namespace ETModel
 	public partial class Actor_TransferResponse: IActorResponse
 	{
 		[ProtoMember(90, IsRequired = true)]
-		public int Error { get; set; }
+		public int RpcId { get; set; }
+
 		[ProtoMember(91, IsRequired = true)]
-		public string Message { get; set; }
+		public int Error { get; set; }
+
 		[ProtoMember(92, IsRequired = true)]
-		public int RpcId { get; set; }
+		public string Message { get; set; }
+
 	}
 
 	[Message(OuterOpcode.C2G_EnterMap)]
@@ -68,6 +88,7 @@ namespace ETModel
 	{
 		[ProtoMember(90, IsRequired = true)]
 		public int RpcId { get; set; }
+
 	}
 
 	[Message(OuterOpcode.G2C_EnterMap)]
@@ -75,11 +96,14 @@ namespace ETModel
 	public partial class G2C_EnterMap: IResponse
 	{
 		[ProtoMember(90, IsRequired = true)]
-		public int Error { get; set; }
+		public int RpcId { get; set; }
+
 		[ProtoMember(91, IsRequired = true)]
-		public string Message { get; set; }
+		public int Error { get; set; }
+
 		[ProtoMember(92, IsRequired = true)]
-		public int RpcId { get; set; }
+		public string Message { get; set; }
+
 		[ProtoMember(1, IsRequired = true)]
 		public long UnitId;
 
@@ -107,6 +131,12 @@ namespace ETModel
 	[ProtoContract]
 	public partial class Actor_CreateUnits: IActorMessage
 	{
+		[ProtoMember(90, IsRequired = true)]
+		public int RpcId { get; set; }
+
+		[ProtoMember(93, IsRequired = true)]
+		public long ActorId { get; set; }
+
 		[ProtoMember(1, TypeName = "ETModel.UnitInfo")]
 		public List<UnitInfo> Units = new List<UnitInfo>();
 
@@ -116,8 +146,15 @@ namespace ETModel
 	[ProtoContract]
 	public partial class Frame_ClickMap: IFrameMessage
 	{
-		[ProtoMember(92, IsRequired = true)]
+		[ProtoMember(90, IsRequired = true)]
+		public int RpcId { get; set; }
+
+		[ProtoMember(93, IsRequired = true)]
+		public long ActorId { get; set; }
+
+		[ProtoMember(94, IsRequired = true)]
 		public long Id { get; set; }
+
 		[ProtoMember(1, IsRequired = true)]
 		public int X;
 
@@ -132,6 +169,7 @@ namespace ETModel
 	{
 		[ProtoMember(90, IsRequired = true)]
 		public int RpcId { get; set; }
+
 		[ProtoMember(1, IsRequired = true)]
 		public AppType AppType;
 
@@ -142,11 +180,14 @@ namespace ETModel
 	public partial class M2C_Reload: IResponse
 	{
 		[ProtoMember(90, IsRequired = true)]
-		public int Error { get; set; }
+		public int RpcId { get; set; }
+
 		[ProtoMember(91, IsRequired = true)]
-		public string Message { get; set; }
+		public int Error { get; set; }
+
 		[ProtoMember(92, IsRequired = true)]
-		public int RpcId { get; set; }
+		public string Message { get; set; }
+
 	}
 
 	[Message(OuterOpcode.C2R_Ping)]
@@ -155,6 +196,7 @@ namespace ETModel
 	{
 		[ProtoMember(90, IsRequired = true)]
 		public int RpcId { get; set; }
+
 	}
 
 	[Message(OuterOpcode.R2C_Ping)]
@@ -162,11 +204,14 @@ namespace ETModel
 	public partial class R2C_Ping: IResponse
 	{
 		[ProtoMember(90, IsRequired = true)]
-		public int Error { get; set; }
+		public int RpcId { get; set; }
+
 		[ProtoMember(91, IsRequired = true)]
-		public string Message { get; set; }
+		public int Error { get; set; }
+
 		[ProtoMember(92, IsRequired = true)]
-		public int RpcId { get; set; }
+		public string Message { get; set; }
+
 	}
 
 }

+ 3 - 1
Unity/Assets/Scripts/Module/Message/Session.cs

@@ -136,12 +136,14 @@ namespace ETModel
 
 			byte flag = packet.Flag();
 			ushort opcode = packet.Opcode();
-			
+
+#if !SERVER
 			if (OpcodeHelper.IsClientHotfixMessage(opcode))
 			{
 				this.Network.MessageDispatcher.Dispatch(this, packet);
 				return;
 			}
+#endif
 
 			// flag第一位为1表示这是rpc返回消息,否则交由MessageDispatcher分发
 			if ((flag & 0x01) == 0)

+ 31 - 12
Unity/Hotfix/Module/Message/HotfixMessage.cs

@@ -10,6 +10,7 @@ namespace ETHotfix
 	{
 		[ProtoMember(90, IsRequired = true)]
 		public int RpcId { get; set; }
+
 		[ProtoMember(1, IsRequired = true)]
 		public string Account;
 
@@ -23,11 +24,14 @@ namespace ETHotfix
 	public partial class R2C_Login: IResponse
 	{
 		[ProtoMember(90, IsRequired = true)]
-		public int Error { get; set; }
+		public int RpcId { get; set; }
+
 		[ProtoMember(91, IsRequired = true)]
-		public string Message { get; set; }
+		public int Error { get; set; }
+
 		[ProtoMember(92, IsRequired = true)]
-		public int RpcId { get; set; }
+		public string Message { get; set; }
+
 		[ProtoMember(1, IsRequired = true)]
 		public string Address;
 
@@ -42,6 +46,7 @@ namespace ETHotfix
 	{
 		[ProtoMember(90, IsRequired = true)]
 		public int RpcId { get; set; }
+
 		[ProtoMember(1, IsRequired = true)]
 		public long Key;
 
@@ -52,11 +57,14 @@ namespace ETHotfix
 	public partial class G2C_LoginGate: IResponse
 	{
 		[ProtoMember(90, IsRequired = true)]
-		public int Error { get; set; }
+		public int RpcId { get; set; }
+
 		[ProtoMember(91, IsRequired = true)]
-		public string Message { get; set; }
+		public int Error { get; set; }
+
 		[ProtoMember(92, IsRequired = true)]
-		public int RpcId { get; set; }
+		public string Message { get; set; }
+
 		[ProtoMember(1, IsRequired = true)]
 		public long PlayerId;
 
@@ -77,6 +85,10 @@ namespace ETHotfix
 	{
 		[ProtoMember(90, IsRequired = true)]
 		public int RpcId { get; set; }
+
+		[ProtoMember(93, IsRequired = true)]
+		public long ActorId { get; set; }
+
 		[ProtoMember(1, IsRequired = true)]
 		public string Info;
 
@@ -87,11 +99,14 @@ namespace ETHotfix
 	public partial class M2C_TestActorResponse: IActorResponse
 	{
 		[ProtoMember(90, IsRequired = true)]
-		public int Error { get; set; }
+		public int RpcId { get; set; }
+
 		[ProtoMember(91, IsRequired = true)]
-		public string Message { get; set; }
+		public int Error { get; set; }
+
 		[ProtoMember(92, IsRequired = true)]
-		public int RpcId { get; set; }
+		public string Message { get; set; }
+
 		[ProtoMember(1, IsRequired = true)]
 		public string Info;
 
@@ -109,6 +124,7 @@ namespace ETHotfix
 	{
 		[ProtoMember(90, IsRequired = true)]
 		public int RpcId { get; set; }
+
 	}
 
 	[Message(HotfixOpcode.G2C_PlayerInfo)]
@@ -116,11 +132,14 @@ namespace ETHotfix
 	public partial class G2C_PlayerInfo: IResponse
 	{
 		[ProtoMember(90, IsRequired = true)]
-		public int Error { get; set; }
+		public int RpcId { get; set; }
+
 		[ProtoMember(91, IsRequired = true)]
-		public string Message { get; set; }
+		public int Error { get; set; }
+
 		[ProtoMember(92, IsRequired = true)]
-		public int RpcId { get; set; }
+		public string Message { get; set; }
+
 		[ProtoMember(1, TypeName = "ETHotfix.PlayerInfo")]
 		public List<PlayerInfo> PlayerInfos = new List<PlayerInfo>();
 

+ 4 - 4
Unity/Hotfix/Module/Message/IActorMessage.cs

@@ -1,15 +1,15 @@
-using MongoDB.Bson.Serialization.Attributes;
-using ProtoBuf;
+using ProtoBuf;
 
 // 不要在这个文件加[ProtoInclude]跟[BsonKnowType]标签,加到InnerMessage.cs或者OuterMessage.cs里面去
 namespace ETHotfix
 {
-	public interface IActorMessage: IMessage
+	public interface IActorMessage: IRequest
 	{
+		long ActorId { get; set; }
 	}
 
 	[ProtoContract]
-	public interface IActorRequest : IRequest
+	public interface IActorRequest : IActorMessage
 	{
 	}