ActorMessageDispatcherComponentSystem.cs 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. using System;
  2. namespace ET
  3. {
  4. [ObjectSystem]
  5. public class ActorMessageDispatcherComponentAwakeSystem: AwakeSystem<ActorMessageDispatcherComponent>
  6. {
  7. public override void Awake(ActorMessageDispatcherComponent self)
  8. {
  9. ActorMessageDispatcherComponent.Instance = self;
  10. self.Awake();
  11. }
  12. }
  13. [ObjectSystem]
  14. public class ActorMessageDispatcherComponentLoadSystem: LoadSystem<ActorMessageDispatcherComponent>
  15. {
  16. public override void Load(ActorMessageDispatcherComponent self)
  17. {
  18. self.Load();
  19. }
  20. }
  21. [ObjectSystem]
  22. public class ActorMessageDispatcherComponentDestroySystem: DestroySystem<ActorMessageDispatcherComponent>
  23. {
  24. public override void Destroy(ActorMessageDispatcherComponent self)
  25. {
  26. self.ActorMessageHandlers.Clear();
  27. ActorMessageDispatcherComponent.Instance = null;
  28. }
  29. }
  30. /// <summary>
  31. /// Actor消息分发组件
  32. /// </summary>
  33. public static class ActorMessageDispatcherComponentHelper
  34. {
  35. public static void Awake(this ActorMessageDispatcherComponent self)
  36. {
  37. self.Load();
  38. }
  39. public static void Load(this ActorMessageDispatcherComponent self)
  40. {
  41. self.ActorMessageHandlers.Clear();
  42. var types = Game.EventSystem.GetTypes(typeof (ActorMessageHandlerAttribute));
  43. foreach (Type type in types)
  44. {
  45. object obj = Activator.CreateInstance(type);
  46. IMActorHandler imHandler = obj as IMActorHandler;
  47. if (imHandler == null)
  48. {
  49. throw new Exception($"message handler not inherit IMActorHandler abstract class: {obj.GetType().FullName}");
  50. }
  51. Type messageType = imHandler.GetRequestType();
  52. Type handleResponseType = imHandler.GetResponseType();
  53. if (handleResponseType != null)
  54. {
  55. Type responseType = OpcodeTypeComponent.Instance.GetResponseType(messageType);
  56. if (handleResponseType != responseType)
  57. {
  58. throw new Exception($"message handler response type error: {messageType.FullName}");
  59. }
  60. }
  61. self.ActorMessageHandlers.Add(messageType, imHandler);
  62. }
  63. }
  64. /// <summary>
  65. /// 分发actor消息
  66. /// </summary>
  67. public static async ETTask Handle(
  68. this ActorMessageDispatcherComponent self, Entity entity, object message, Action<IActorResponse> reply)
  69. {
  70. if (!self.ActorMessageHandlers.TryGetValue(message.GetType(), out IMActorHandler handler))
  71. {
  72. throw new Exception($"not found message handler: {message}");
  73. }
  74. await handler.Handle(entity, message, reply);
  75. }
  76. public static bool TryGetHandler(this ActorMessageDispatcherComponent self,Type type, out IMActorHandler actorHandler)
  77. {
  78. return self.ActorMessageHandlers.TryGetValue(type, out actorHandler);
  79. }
  80. }
  81. }