ActorMessageDispatcherComponentSystem.cs 2.1 KB

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