Эх сурвалжийг харах

去掉了一个恶心的reply,这个回调从NetInnerComponentOnReadEvents一直传到消息的handler,非常恶心
现在一个rpc handler消息不用再调用reply,return就会自动reply了

tanghai 3 жил өмнө
parent
commit
a123871a3e
23 өөрчлөгдсөн 188 нэмэгдсэн , 182 устгасан
  1. 1 2
      Unity/Assets/Scripts/Codes/Hotfix/Server/Demo/Scenes/Gate/R2G_GetLoginKeyHandler.cs
  2. 1 2
      Unity/Assets/Scripts/Codes/Hotfix/Server/Demo/Scenes/Map/C2M_TestRobotCaseHandler.cs
  3. 1 3
      Unity/Assets/Scripts/Codes/Hotfix/Server/Demo/Scenes/Map/Transfer/C2M_TransferMapHandler.cs
  4. 1 3
      Unity/Assets/Scripts/Codes/Hotfix/Server/Demo/Scenes/Map/Transfer/M2M_UnitTransferRequestHandler.cs
  5. 5 103
      Unity/Assets/Scripts/Codes/Hotfix/Server/Demo/Session/NetInnerComponentOnReadEvent.cs
  6. 4 5
      Unity/Assets/Scripts/Codes/Hotfix/Server/Module/Actor/AMActorHandler.cs
  7. 1 1
      Unity/Assets/Scripts/Codes/Hotfix/Server/Module/Actor/AMActorHandler.cs.meta
  8. 8 15
      Unity/Assets/Scripts/Codes/Hotfix/Server/Module/Actor/AMActorRpcHandler.cs
  9. 1 1
      Unity/Assets/Scripts/Codes/Hotfix/Server/Module/Actor/AMActorRpcHandler.cs.meta
  10. 131 0
      Unity/Assets/Scripts/Codes/Hotfix/Server/Module/Actor/ActorHandleHelper.cs
  11. 11 0
      Unity/Assets/Scripts/Codes/Hotfix/Server/Module/Actor/ActorHandleHelper.cs.meta
  12. 2 6
      Unity/Assets/Scripts/Codes/Hotfix/Server/Module/Actor/ActorMessageDispatcherComponentSystem.cs
  13. 1 1
      Unity/Assets/Scripts/Codes/Hotfix/Server/Module/Actor/ActorMessageSenderComponentSystem.cs
  14. 4 4
      Unity/Assets/Scripts/Codes/Hotfix/Server/Module/ActorLocation/AMActorLocationHandler.cs
  15. 1 1
      Unity/Assets/Scripts/Codes/Hotfix/Server/Module/ActorLocation/AMActorLocationHandler.cs.meta
  16. 8 15
      Unity/Assets/Scripts/Codes/Hotfix/Server/Module/ActorLocation/AMActorLocationRpcHandler.cs
  17. 1 1
      Unity/Assets/Scripts/Codes/Hotfix/Server/Module/ActorLocation/AMActorLocationRpcHandler.cs.meta
  18. 1 5
      Unity/Assets/Scripts/Codes/Hotfix/Server/Module/ActorLocation/ObjectAddRequestHandler.cs
  19. 1 2
      Unity/Assets/Scripts/Codes/Hotfix/Server/Module/ActorLocation/ObjectGetRequestHandler.cs
  20. 1 5
      Unity/Assets/Scripts/Codes/Hotfix/Server/Module/ActorLocation/ObjectLockRequestHandler.cs
  21. 1 3
      Unity/Assets/Scripts/Codes/Hotfix/Server/Module/ActorLocation/ObjectRemoveRequestHandler.cs
  22. 1 3
      Unity/Assets/Scripts/Codes/Hotfix/Server/Module/ActorLocation/ObjectUnLockRequestHandler.cs
  23. 1 1
      Unity/Assets/Scripts/Codes/Model/Server/Module/Actor/IMActorHandler.cs

+ 1 - 2
Unity/Assets/Scripts/Codes/Hotfix/Server/Demo/Scenes/Gate/R2G_GetLoginKeyHandler.cs

@@ -6,13 +6,12 @@ namespace ET.Server
 	[ActorMessageHandler(SceneType.Gate)]
 	public class R2G_GetLoginKeyHandler : AMActorRpcHandler<Scene, R2G_GetLoginKey, G2R_GetLoginKey>
 	{
-		protected override async ETTask Run(Scene scene, R2G_GetLoginKey request, G2R_GetLoginKey response, Action reply)
+		protected override async ETTask Run(Scene scene, R2G_GetLoginKey request, G2R_GetLoginKey response)
 		{
 			long key = RandomGenerator.RandInt64();
 			scene.GetComponent<GateSessionKeyComponent>().Add(key, request.Account);
 			response.Key = key;
 			response.GateId = scene.Id;
-			reply();
 			await ETTask.CompletedTask;
 		}
 	}

+ 1 - 2
Unity/Assets/Scripts/Codes/Hotfix/Server/Demo/Scenes/Map/C2M_TestRobotCaseHandler.cs

@@ -5,10 +5,9 @@ namespace ET.Server
 	[ActorMessageHandler(SceneType.Map)]
 	public class C2M_TestRobotCaseHandler : AMActorLocationRpcHandler<Unit, C2M_TestRobotCase, M2C_TestRobotCase>
 	{
-		protected override async ETTask Run(Unit unit, C2M_TestRobotCase request, M2C_TestRobotCase response, Action reply)
+		protected override async ETTask Run(Unit unit, C2M_TestRobotCase request, M2C_TestRobotCase response)
 		{
 			response.N = request.N;
-			reply();
 			await ETTask.CompletedTask;
 		}
 	}

+ 1 - 3
Unity/Assets/Scripts/Codes/Hotfix/Server/Demo/Scenes/Map/Transfer/C2M_TransferMapHandler.cs

@@ -5,7 +5,7 @@ namespace ET.Server
 	[ActorMessageHandler(SceneType.Map)]
 	public class C2M_TransferMapHandler : AMActorLocationRpcHandler<Unit, C2M_TransferMap, M2C_TransferMap>
 	{
-		protected override async ETTask Run(Unit unit, C2M_TransferMap request, M2C_TransferMap response, Action reply)
+		protected override async ETTask Run(Unit unit, C2M_TransferMap request, M2C_TransferMap response)
 		{
 			await ETTask.CompletedTask;
 
@@ -22,8 +22,6 @@ namespace ET.Server
 
 			StartSceneConfig startSceneConfig = StartSceneConfigCategory.Instance.GetBySceneName(unit.DomainScene().Zone, toMap);
 			TransferHelper.Transfer(unit, startSceneConfig.InstanceId, toMap).Coroutine();
-			
-			reply();
 		}
 	}
 }

+ 1 - 3
Unity/Assets/Scripts/Codes/Hotfix/Server/Demo/Scenes/Map/Transfer/M2M_UnitTransferRequestHandler.cs

@@ -6,10 +6,8 @@ namespace ET.Server
 	[ActorMessageHandler(SceneType.Map)]
 	public class M2M_UnitTransferRequestHandler : AMActorRpcHandler<Scene, M2M_UnitTransferRequest, M2M_UnitTransferResponse>
 	{
-		protected override async ETTask Run(Scene scene, M2M_UnitTransferRequest request, M2M_UnitTransferResponse response, Action reply)
+		protected override async ETTask Run(Scene scene, M2M_UnitTransferRequest request, M2M_UnitTransferResponse response)
 		{
-			reply();
-			
 			UnitComponent unitComponent = scene.GetComponent<UnitComponent>();
 			Unit unit = MongoHelper.Deserialize<Unit>(request.Unit);
 			

+ 5 - 103
Unity/Assets/Scripts/Codes/Hotfix/Server/Demo/Session/NetInnerComponentOnReadEvent.cs

@@ -5,129 +5,29 @@ namespace ET.Server
     [Event(SceneType.Process)]
     public class NetInnerComponentOnReadEvent: AEvent<NetInnerComponentOnRead>
     {
-        [EnableAccessEntiyChild]
         protected override async ETTask Run(Scene scene, NetInnerComponentOnRead args)
         {
             try
             {
                 long actorId = args.ActorId;
                 object message = args.Message;
-
-                InstanceIdStruct instanceIdStruct = new(actorId);
-                int fromProcess = instanceIdStruct.Process;
-                instanceIdStruct.Process = Options.Instance.Process;
-                long realActorId = instanceIdStruct.ToLong();
                 
                 // 收到actor消息,放入actor队列
                 switch (message)
                 {
                     case IActorResponse iActorResponse:
                     {
-                        ActorMessageSenderComponent.Instance.RunMessage(realActorId, iActorResponse);
+                        ActorHandleHelper.HandleIActorResponse(iActorResponse);
                         break;
                     }
                     case IActorRequest iActorRequest:
                     {
-                        void Reply(IActorResponse response)
-                        {
-                            if (fromProcess == Options.Instance.Process) // 返回消息是同一个进程
-                            {
-                                // NetInnerComponent.Instance.HandleMessage(realActorId, response); 等同于直接调用下面这句
-                                ActorMessageSenderComponent.Instance.RunMessage(realActorId, response);
-                                return;
-                            }
-                            
-                            Session replySession = NetInnerComponent.Instance.Get(fromProcess);
-                            // 发回真实的actorId 做查问题使用
-                            replySession.Send(realActorId, response);
-                        }
-                        
-                        Entity entity = Root.Instance.Get(realActorId);
-                        if (entity == null)
-                        {
-                            IActorResponse response = ActorHelper.CreateResponse(iActorRequest, ErrorCore.ERR_NotFoundActor);
-                            Reply(response);
-                            break;
-                        }
-
-                        MailBoxComponent mailBoxComponent = entity.GetComponent<MailBoxComponent>();
-                        if (mailBoxComponent == null)
-                        {
-                            Log.Warning($"actor not found mailbox: {entity.GetType().Name} {realActorId} {iActorRequest}");
-                            IActorResponse response = ActorHelper.CreateResponse(iActorRequest, ErrorCore.ERR_NotFoundActor);
-                            Reply(response);
-                            break;
-                        }
-
-                        switch (mailBoxComponent.MailboxType)
-                        {
-                            case MailboxType.MessageDispatcher:
-                            {
-                                using (await CoroutineLockComponent.Instance.Wait(CoroutineLockType.Mailbox, realActorId))
-                                {
-                                    if (entity.InstanceId != realActorId)
-                                    {
-                                        IActorResponse response = ActorHelper.CreateResponse(iActorRequest, ErrorCore.ERR_NotFoundActor);
-                                        Reply(response);
-                                        break;
-                                    }
-                                    await ActorMessageDispatcherComponent.Instance.Handle(entity, iActorRequest, Reply);
-                                }
-                                break;
-                            }
-                            case MailboxType.UnOrderMessageDispatcher:
-                            {
-                                await ActorMessageDispatcherComponent.Instance.Handle(entity, iActorRequest, Reply);
-                                break;
-                            }
-                        }
+                        await ActorHandleHelper.HandleIActorRequest(actorId, iActorRequest);
                         break;
                     }
                     case IActorMessage iActorMessage:
                     {
-                        Entity entity = Root.Instance.Get(realActorId);
-                        if (entity == null)
-                        {
-                            Log.Error($"not found actor: {scene.Name} {realActorId} {message}");
-                            break;
-                        }
-                        
-                        MailBoxComponent mailBoxComponent = entity.GetComponent<MailBoxComponent>();
-                        if (mailBoxComponent == null)
-                        {
-                            Log.Error($"actor not found mailbox: {entity.GetType().Name} {realActorId} {iActorMessage}");
-                            break;
-                        }
-
-                        switch (mailBoxComponent.MailboxType)
-                        {
-                            case MailboxType.MessageDispatcher:
-                            {
-                                using (await CoroutineLockComponent.Instance.Wait(CoroutineLockType.Mailbox, realActorId))
-                                {
-                                    if (entity.InstanceId != realActorId)
-                                    {
-                                        break;
-                                    }
-                                    await ActorMessageDispatcherComponent.Instance.Handle(entity, iActorMessage, null);
-                                }
-                                break;
-                            }
-                            case MailboxType.UnOrderMessageDispatcher:
-                            {
-                                await ActorMessageDispatcherComponent.Instance.Handle(entity, iActorMessage, null);
-                                break;
-                            }
-                            case MailboxType.GateSession:
-                            {
-                                if (entity is Session gateSession)
-                                {
-                                    // 发送给客户端
-                                    gateSession.Send(0, iActorMessage);
-                                }
-                                break;
-                            }
-                        }
+                        await ActorHandleHelper.HandleIActorMessage(actorId, iActorMessage);
                         break;
                     }
                 }
@@ -136,6 +36,8 @@ namespace ET.Server
             {
                 Log.Error($"InnerMessageDispatcher error: {args.Message.GetType().Name}\n{e}");
             }
+
+            await ETTask.CompletedTask;
         }
     }
 }

+ 4 - 5
Unity/Assets/Scripts/Codes/Model/Server/Module/Actor/AMActorHandler.cs → Unity/Assets/Scripts/Codes/Hotfix/Server/Module/Actor/AMActorHandler.cs

@@ -2,21 +2,20 @@
 
 namespace ET.Server
 {
+    [EnableClass]
     public abstract class AMActorHandler<E, Message>: IMActorHandler where E : Entity where Message : class, IActorMessage
     {
         protected abstract ETTask Run(E entity, Message message);
 
-        public async ETTask Handle(Entity entity, object actorMessage, Action<IActorResponse> reply)
+        public async ETTask Handle(Entity entity, int fromProcess, object actorMessage)
         {
-            Message msg = actorMessage as Message;
-            if (msg == null)
+            if (actorMessage is not Message msg)
             {
                 Log.Error($"消息类型转换错误: {actorMessage.GetType().FullName} to {typeof (Message).Name}");
                 return;
             }
 
-            E e = entity as E;
-            if (e == null)
+            if (entity is not E e)
             {
                 Log.Error($"Actor类型转换错误: {entity.GetType().Name} to {typeof (E).Name} --{typeof (Message).Name}");
                 return;

+ 1 - 1
Unity/Assets/Scripts/Codes/Model/Server/Module/Actor/AMActorHandler.cs.meta → Unity/Assets/Scripts/Codes/Hotfix/Server/Module/Actor/AMActorHandler.cs.meta

@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 6b8b9108d63c7614fb6c3d3a123488cd
+guid: c1692e66d0661b4498c5aaf1cd51dc9b
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2

+ 8 - 15
Unity/Assets/Scripts/Codes/Model/Server/Module/Actor/AMActorRpcHandler.cs → Unity/Assets/Scripts/Codes/Hotfix/Server/Module/Actor/AMActorRpcHandler.cs

@@ -2,48 +2,41 @@
 
 namespace ET.Server
 {
+    [EnableClass]
     public abstract class AMActorRpcHandler<E, Request, Response>: IMActorHandler where E : Entity where Request : class, IActorRequest where Response : class, IActorResponse
     {
-        protected abstract ETTask Run(E unit, Request request, Response response, Action reply);
+        protected abstract ETTask Run(E unit, Request request, Response response);
 
-        public async ETTask Handle(Entity entity, object actorMessage, Action<IActorResponse> reply)
+        public async ETTask Handle(Entity entity, int fromProcess, object actorMessage)
         {
             try
             {
-                Request request = actorMessage as Request;
-                if (request == null)
+                if (actorMessage is not Request request)
                 {
                     Log.Error($"消息类型转换错误: {actorMessage.GetType().FullName} to {typeof (Request).Name}");
                     return;
                 }
 
-                E ee = entity as E;
-                if (ee == null)
+                if (entity is not E ee)
                 {
                     Log.Error($"Actor类型转换错误: {entity.GetType().Name} to {typeof (E).Name} --{typeof (Request).Name}");
                     return;
                 }
 
-                int rpcId = request.RpcId;
                 Response response = Activator.CreateInstance<Response>();
-
-                void Reply()
-                {
-                    response.RpcId = rpcId;
-                    reply.Invoke(response);
-                }
+                response.RpcId = request.RpcId;
 
                 try
                 {
-                    await this.Run(ee, request, response, Reply);
+                    await this.Run(ee, request, response);
                 }
                 catch (Exception exception)
                 {
                     Log.Error(exception);
                     response.Error = ErrorCore.ERR_RpcFail;
                     response.Message = exception.ToString();
-                    Reply();
                 }
+                ActorHandleHelper.Reply(fromProcess, response);
             }
             catch (Exception e)
             {

+ 1 - 1
Unity/Assets/Scripts/Codes/Model/Server/Module/Actor/AMActorRpcHandler.cs.meta → Unity/Assets/Scripts/Codes/Hotfix/Server/Module/Actor/AMActorRpcHandler.cs.meta

@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 429aa3407311e844eb7b2431a665f276
+guid: 60daa362514eebe43a33fbcbf566c9a0
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2

+ 131 - 0
Unity/Assets/Scripts/Codes/Hotfix/Server/Module/Actor/ActorHandleHelper.cs

@@ -0,0 +1,131 @@
+namespace ET.Server
+{
+    public static class ActorHandleHelper
+    {
+        public static void Reply(int fromProcess, IActorResponse response)
+        {
+            if (fromProcess == Options.Instance.Process) // 返回消息是同一个进程
+            {
+                // NetInnerComponent.Instance.HandleMessage(realActorId, response); 等同于直接调用下面这句
+                ActorMessageSenderComponent.Instance.HandleIActorResponse(response);
+                return;
+            }
+
+            Session replySession = NetInnerComponent.Instance.Get(fromProcess);
+            replySession.Send(response);
+        }
+        
+        public static void HandleIActorResponse(IActorResponse response)
+        {
+            ActorMessageSenderComponent.Instance.HandleIActorResponse(response);
+        }
+        
+        /// <summary>
+        /// 分发actor消息
+        /// </summary>
+        [EnableAccessEntiyChild]
+        public static async ETTask HandleIActorRequest(long actorId, IActorRequest iActorRequest)
+        {
+            InstanceIdStruct instanceIdStruct = new(actorId);
+            int fromProcess = instanceIdStruct.Process;
+            instanceIdStruct.Process = Options.Instance.Process;
+            long realActorId = instanceIdStruct.ToLong();
+
+            Entity entity = Root.Instance.Get(realActorId);
+            if (entity == null)
+            {
+                IActorResponse response = ActorHelper.CreateResponse(iActorRequest, ErrorCore.ERR_NotFoundActor);
+                Reply(fromProcess, response);
+                return;
+            }
+
+            MailBoxComponent mailBoxComponent = entity.GetComponent<MailBoxComponent>();
+            if (mailBoxComponent == null)
+            {
+                Log.Warning($"actor not found mailbox: {entity.GetType().Name} {realActorId} {iActorRequest}");
+                IActorResponse response = ActorHelper.CreateResponse(iActorRequest, ErrorCore.ERR_NotFoundActor);
+                Reply(fromProcess, response);
+                return;
+            }
+            
+            switch (mailBoxComponent.MailboxType)
+            {
+                case MailboxType.MessageDispatcher:
+                {
+                    using (await CoroutineLockComponent.Instance.Wait(CoroutineLockType.Mailbox, realActorId))
+                    {
+                        if (entity.InstanceId != realActorId)
+                        {
+                            IActorResponse response = ActorHelper.CreateResponse(iActorRequest, ErrorCore.ERR_NotFoundActor);
+                            Reply(fromProcess, response);
+                            break;
+                        }
+                        await ActorMessageDispatcherComponent.Instance.Handle(entity, fromProcess, iActorRequest);
+                    }
+                    break;
+                }
+                case MailboxType.UnOrderMessageDispatcher:
+                {
+                    await ActorMessageDispatcherComponent.Instance.Handle(entity, fromProcess, iActorRequest);
+                    break;
+                }
+            }
+        }
+        
+        /// <summary>
+        /// 分发actor消息
+        /// </summary>
+        [EnableAccessEntiyChild]
+        public static async ETTask HandleIActorMessage(long actorId, IActorMessage iActorMessage)
+        {
+            InstanceIdStruct instanceIdStruct = new(actorId);
+            int fromProcess = instanceIdStruct.Process;
+            instanceIdStruct.Process = Options.Instance.Process;
+            long realActorId = instanceIdStruct.ToLong();
+            
+            Entity entity = Root.Instance.Get(realActorId);
+            if (entity == null)
+            {
+                Log.Error($"not found actor: {realActorId} {iActorMessage}");
+                return;
+            }
+            
+            MailBoxComponent mailBoxComponent = entity.GetComponent<MailBoxComponent>();
+            if (mailBoxComponent == null)
+            {
+                Log.Error($"actor not found mailbox: {entity.GetType().Name} {realActorId} {iActorMessage}");
+                return;
+            }
+
+            switch (mailBoxComponent.MailboxType)
+            {
+                case MailboxType.MessageDispatcher:
+                {
+                    using (await CoroutineLockComponent.Instance.Wait(CoroutineLockType.Mailbox, realActorId))
+                    {
+                        if (entity.InstanceId != realActorId)
+                        {
+                            break;
+                        }
+                        await ActorMessageDispatcherComponent.Instance.Handle(entity, fromProcess, iActorMessage);
+                    }
+                    break;
+                }
+                case MailboxType.UnOrderMessageDispatcher:
+                {
+                    await ActorMessageDispatcherComponent.Instance.Handle(entity, fromProcess, iActorMessage);
+                    break;
+                }
+                case MailboxType.GateSession:
+                {
+                    if (entity is Session gateSession)
+                    {
+                        // 发送给客户端
+                        gateSession.Send(0, iActorMessage);
+                    }
+                    break;
+                }
+            }
+        }
+    }
+}

+ 11 - 0
Unity/Assets/Scripts/Codes/Hotfix/Server/Module/Actor/ActorHandleHelper.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: db010549ca0dacb4aad130643706b6f8
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 2 - 6
Unity/Assets/Scripts/Codes/Hotfix/Server/Module/Actor/ActorMessageDispatcherComponentSystem.cs

@@ -93,11 +93,7 @@ namespace ET.Server
             self.ActorMessageHandlers[type].Add(handler);
         }
 
-        /// <summary>
-        /// 分发actor消息
-        /// </summary>
-        public static async ETTask Handle(
-            this ActorMessageDispatcherComponent self, Entity entity, object message, Action<IActorResponse> reply)
+        public static async ETTask Handle(this ActorMessageDispatcherComponent self, Entity entity, int fromProcess, object message)
         {
             List<ActorMessageDispatcherInfo> list;
             if (!self.ActorMessageHandlers.TryGetValue(message.GetType(), out list))
@@ -112,7 +108,7 @@ namespace ET.Server
                 {
                     continue;
                 }
-                await actorMessageDispatcherInfo.IMActorHandler.Handle(entity, message, reply);   
+                await actorMessageDispatcherInfo.IMActorHandler.Handle(entity, fromProcess, message);   
             }
         }
     }

+ 1 - 1
Unity/Assets/Scripts/Codes/Hotfix/Server/Module/Actor/ActorMessageSenderComponentSystem.cs

@@ -168,7 +168,7 @@ namespace ET.Server
             return response;
         }
 
-        public static void RunMessage(this ActorMessageSenderComponent self, long actorId, IActorResponse response)
+        public static void HandleIActorResponse(this ActorMessageSenderComponent self, IActorResponse response)
         {
             ActorMessageSender actorMessageSender;
             if (!self.requestCallback.TryGetValue(response.RpcId, out actorMessageSender))

+ 4 - 4
Unity/Assets/Scripts/Codes/Model/Server/Module/ActorLocation/AMActorLocationHandler.cs → Unity/Assets/Scripts/Codes/Hotfix/Server/Module/ActorLocation/AMActorLocationHandler.cs

@@ -2,11 +2,12 @@
 
 namespace ET.Server
 {
+    [EnableClass]
     public abstract class AMActorLocationHandler<E, Message>: IMActorHandler where E : Entity where Message : class, IActorLocationMessage
     {
         protected abstract ETTask Run(E entity, Message message);
 
-        public async ETTask Handle(Entity entity, object actorMessage, Action<IActorResponse> reply)
+        public async ETTask Handle(Entity entity, int fromProcess, object actorMessage)
         {
             Message msg = actorMessage as Message;
             if (msg == null)
@@ -15,8 +16,7 @@ namespace ET.Server
                 return;
             }
 
-            E e = entity as E;
-            if (e == null)
+            if (entity is not E e)
             {
                 Log.Error($"Actor类型转换错误: {entity.GetType().Name} to {typeof (E).Name} --{typeof (Message).Name}");
                 return;
@@ -24,7 +24,7 @@ namespace ET.Server
 
             IActorResponse response = (IActorResponse) Activator.CreateInstance(GetResponseType());
             response.RpcId = msg.RpcId;
-            reply.Invoke(response);
+            ActorHandleHelper.Reply(fromProcess, response);
 
             await this.Run(e, msg);
         }

+ 1 - 1
Unity/Assets/Scripts/Codes/Model/Server/Module/ActorLocation/AMActorLocationHandler.cs.meta → Unity/Assets/Scripts/Codes/Hotfix/Server/Module/ActorLocation/AMActorLocationHandler.cs.meta

@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 7190cf510fbb1bc449f6cf75f93f8fc0
+guid: 3b2a0088a0a9c93448fe5cddbe1874f7
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2

+ 8 - 15
Unity/Assets/Scripts/Codes/Model/Server/Module/ActorLocation/AMActorLocationRpcHandler.cs → Unity/Assets/Scripts/Codes/Hotfix/Server/Module/ActorLocation/AMActorLocationRpcHandler.cs

@@ -2,48 +2,41 @@
 
 namespace ET.Server
 {
+    [EnableClass]
     public abstract class AMActorLocationRpcHandler<E, Request, Response>: IMActorHandler where E : Entity where Request : class, IActorLocationRequest where Response : class, IActorLocationResponse
     {
-        protected abstract ETTask Run(E unit, Request request, Response response, Action reply);
+        protected abstract ETTask Run(E unit, Request request, Response response);
 
-        public async ETTask Handle(Entity entity, object actorMessage, Action<IActorResponse> reply)
+        public async ETTask Handle(Entity entity, int fromProcess, object actorMessage)
         {
             try
             {
-                Request request = actorMessage as Request;
-                if (request == null)
+                if (actorMessage is not Request request)
                 {
                     Log.Error($"消息类型转换错误: {actorMessage.GetType().FullName} to {typeof (Request).Name}");
                     return;
                 }
 
-                E ee = entity as E;
-                if (ee == null)
+                if (entity is not E ee)
                 {
                     Log.Error($"Actor类型转换错误: {entity.GetType().Name} to {typeof (E).Name} --{typeof (Request).Name}");
                     return;
                 }
 
-                int rpcId = request.RpcId;
                 Response response = Activator.CreateInstance<Response>();
-
-                void Reply()
-                {
-                    response.RpcId = rpcId;
-                    reply.Invoke(response);
-                }
+                response.RpcId = request.RpcId;
 
                 try
                 {
-                    await this.Run(ee, request, response, Reply);
+                    await this.Run(ee, request, response);
                 }
                 catch (Exception exception)
                 {
                     Log.Error(exception);
                     response.Error = ErrorCore.ERR_RpcFail;
                     response.Message = exception.ToString();
-                    Reply();
                 }
+                ActorHandleHelper.Reply(fromProcess, response);
             }
             catch (Exception e)
             {

+ 1 - 1
Unity/Assets/Scripts/Codes/Model/Server/Module/ActorLocation/AMActorLocationRpcHandler.cs.meta → Unity/Assets/Scripts/Codes/Hotfix/Server/Module/ActorLocation/AMActorLocationRpcHandler.cs.meta

@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: e773af907b2137e4db6d87a246096be7
+guid: b600ff66c60bb2f4d8081a24077bd2ae
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2

+ 1 - 5
Unity/Assets/Scripts/Codes/Hotfix/Server/Module/ActorLocation/ObjectAddRequestHandler.cs

@@ -5,13 +5,9 @@ namespace ET.Server
     [ActorMessageHandler(SceneType.Location)]
     public class ObjectAddRequestHandler: AMActorRpcHandler<Scene, ObjectAddRequest, ObjectAddResponse>
     {
-        protected override async ETTask Run(Scene scene, ObjectAddRequest request, ObjectAddResponse response, Action reply)
+        protected override async ETTask Run(Scene scene, ObjectAddRequest request, ObjectAddResponse response)
         {
             await scene.GetComponent<LocationComponent>().Add(request.Key, request.InstanceId);
-
-            reply();
-
-            await ETTask.CompletedTask;
         }
     }
 }

+ 1 - 2
Unity/Assets/Scripts/Codes/Hotfix/Server/Module/ActorLocation/ObjectGetRequestHandler.cs

@@ -5,11 +5,10 @@ namespace ET.Server
     [ActorMessageHandler(SceneType.Location)]
     public class ObjectGetRequestHandler: AMActorRpcHandler<Scene, ObjectGetRequest, ObjectGetResponse>
     {
-        protected override async ETTask Run(Scene scene, ObjectGetRequest request, ObjectGetResponse response, Action reply)
+        protected override async ETTask Run(Scene scene, ObjectGetRequest request, ObjectGetResponse response)
         {
             long instanceId = await scene.GetComponent<LocationComponent>().Get(request.Key);
             response.InstanceId = instanceId;
-            reply();
         }
     }
 }

+ 1 - 5
Unity/Assets/Scripts/Codes/Hotfix/Server/Module/ActorLocation/ObjectLockRequestHandler.cs

@@ -5,13 +5,9 @@ namespace ET.Server
     [ActorMessageHandler(SceneType.Location)]
     public class ObjectLockRequestHandler: AMActorRpcHandler<Scene, ObjectLockRequest, ObjectLockResponse>
     {
-        protected override async ETTask Run(Scene scene, ObjectLockRequest request, ObjectLockResponse response, Action reply)
+        protected override async ETTask Run(Scene scene, ObjectLockRequest request, ObjectLockResponse response)
         {
             await scene.GetComponent<LocationComponent>().Lock(request.Key, request.InstanceId, request.Time);
-
-            reply();
-
-            await ETTask.CompletedTask;
         }
     }
 }

+ 1 - 3
Unity/Assets/Scripts/Codes/Hotfix/Server/Module/ActorLocation/ObjectRemoveRequestHandler.cs

@@ -5,11 +5,9 @@ namespace ET.Server
     [ActorMessageHandler(SceneType.Location)]
     public class ObjectRemoveRequestHandler: AMActorRpcHandler<Scene, ObjectRemoveRequest, ObjectRemoveResponse>
     {
-        protected override async ETTask Run(Scene scene, ObjectRemoveRequest request, ObjectRemoveResponse response, Action reply)
+        protected override async ETTask Run(Scene scene, ObjectRemoveRequest request, ObjectRemoveResponse response)
         {
             await scene.GetComponent<LocationComponent>().Remove(request.Key);
-
-            reply();
         }
     }
 }

+ 1 - 3
Unity/Assets/Scripts/Codes/Hotfix/Server/Module/ActorLocation/ObjectUnLockRequestHandler.cs

@@ -5,12 +5,10 @@ namespace ET.Server
     [ActorMessageHandler(SceneType.Location)]
     public class ObjectUnLockRequestHandler: AMActorRpcHandler<Scene, ObjectUnLockRequest, ObjectUnLockResponse>
     {
-        protected override async ETTask Run(Scene scene, ObjectUnLockRequest request, ObjectUnLockResponse response, Action reply)
+        protected override async ETTask Run(Scene scene, ObjectUnLockRequest request, ObjectUnLockResponse response)
         {
             scene.GetComponent<LocationComponent>().UnLock(request.Key, request.OldInstanceId, request.InstanceId);
 
-            reply();
-
             await ETTask.CompletedTask;
         }
     }

+ 1 - 1
Unity/Assets/Scripts/Codes/Model/Server/Module/Actor/IMActorHandler.cs

@@ -4,7 +4,7 @@ namespace ET.Server
 {
     public interface IMActorHandler
     {
-        ETTask Handle(Entity entity, object actorMessage, Action<IActorResponse> reply);
+        ETTask Handle(Entity entity, int fromProcess, object actorMessage);
         Type GetRequestType();
         Type GetResponseType();
     }