ActorMessageDispatcherComponentSystem.cs 2.0 KB

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