ActorMessageDispatcherComponentSystem.cs 3.3 KB

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