ActorMessageDispatcherComponentSystem.cs 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. using System;
  2. using System.Collections.Generic;
  3. namespace ET
  4. {
  5. [ObjectSystem]
  6. public class ActorMessageDispatcherComponentAwakeSystem: AwakeSystem<ActorMessageDispatcherComponent>
  7. {
  8. public override void Awake(ActorMessageDispatcherComponent self)
  9. {
  10. ActorMessageDispatcherComponent.Instance = self;
  11. self.Awake();
  12. }
  13. }
  14. [ObjectSystem]
  15. public class ActorMessageDispatcherComponentLoadSystem: LoadSystem<ActorMessageDispatcherComponent>
  16. {
  17. public override void Load(ActorMessageDispatcherComponent self)
  18. {
  19. self.Load();
  20. }
  21. }
  22. [ObjectSystem]
  23. public class ActorMessageDispatcherComponentDestroySystem: DestroySystem<ActorMessageDispatcherComponent>
  24. {
  25. public override void Destroy(ActorMessageDispatcherComponent self)
  26. {
  27. self.ActorMessageHandlers.Clear();
  28. ActorMessageDispatcherComponent.Instance = null;
  29. }
  30. }
  31. /// <summary>
  32. /// Actor消息分发组件
  33. /// </summary>
  34. public static class ActorMessageDispatcherComponentHelper
  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. HashSet<Type> 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.GetMessageType();
  53. self.ActorMessageHandlers.Add(messageType, imHandler);
  54. }
  55. }
  56. /// <summary>
  57. /// 分发actor消息
  58. /// </summary>
  59. public static async ETTask Handle(
  60. this ActorMessageDispatcherComponent self, Entity entity, Session session, object message)
  61. {
  62. if (!self.ActorMessageHandlers.TryGetValue(message.GetType(), out IMActorHandler handler))
  63. {
  64. throw new Exception($"not found message handler: {message}");
  65. }
  66. await handler.Handle(session, entity, message);
  67. }
  68. }
  69. }