NumericWatcherComponent.cs 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. using System;
  2. using System.Collections.Generic;
  3. namespace ET
  4. {
  5. [FriendOf(typeof(NumericWatcherComponent))]
  6. public static class NumericWatcherComponentSystem
  7. {
  8. [ObjectSystem]
  9. public class NumericWatcherComponentAwakeSystem : AwakeSystem<NumericWatcherComponent>
  10. {
  11. protected override void Awake(NumericWatcherComponent self)
  12. {
  13. NumericWatcherComponent.Instance = self;
  14. self.Init();
  15. }
  16. }
  17. public class NumericWatcherComponentLoadSystem : LoadSystem<NumericWatcherComponent>
  18. {
  19. protected override void Load(NumericWatcherComponent self)
  20. {
  21. self.Init();
  22. }
  23. }
  24. private static void Init(this NumericWatcherComponent self)
  25. {
  26. self.allWatchers = new Dictionary<int, List<NumericWatcherInfo>>();
  27. HashSet<Type> types = EventSystem.Instance.GetTypes(typeof(NumericWatcherAttribute));
  28. foreach (Type type in types)
  29. {
  30. object[] attrs = type.GetCustomAttributes(typeof(NumericWatcherAttribute), false);
  31. foreach (object attr in attrs)
  32. {
  33. NumericWatcherAttribute numericWatcherAttribute = (NumericWatcherAttribute)attr;
  34. INumericWatcher obj = (INumericWatcher)Activator.CreateInstance(type);
  35. NumericWatcherInfo numericWatcherInfo = new NumericWatcherInfo(numericWatcherAttribute.SceneType, obj);
  36. if (!self.allWatchers.ContainsKey(numericWatcherAttribute.NumericType))
  37. {
  38. self.allWatchers.Add(numericWatcherAttribute.NumericType, new List<NumericWatcherInfo>());
  39. }
  40. self.allWatchers[numericWatcherAttribute.NumericType].Add(numericWatcherInfo);
  41. }
  42. }
  43. }
  44. public static void Run(this NumericWatcherComponent self, Unit unit, EventType.NumbericChange args)
  45. {
  46. List<NumericWatcherInfo> list;
  47. if (!self.allWatchers.TryGetValue(args.NumericType, out list))
  48. {
  49. return;
  50. }
  51. SceneType unitDomainSceneType = unit.DomainScene().SceneType;
  52. foreach (NumericWatcherInfo numericWatcher in list)
  53. {
  54. if (numericWatcher.SceneType != unitDomainSceneType)
  55. {
  56. continue;
  57. }
  58. numericWatcher.INumericWatcher.Run(unit, args);
  59. }
  60. }
  61. }
  62. public class NumericWatcherInfo
  63. {
  64. public SceneType SceneType { get; }
  65. public INumericWatcher INumericWatcher { get; }
  66. public NumericWatcherInfo(SceneType sceneType, INumericWatcher numericWatcher)
  67. {
  68. this.SceneType = sceneType;
  69. this.INumericWatcher = numericWatcher;
  70. }
  71. }
  72. /// <summary>
  73. /// 监视数值变化组件,分发监听
  74. /// </summary>
  75. [ComponentOf(typeof(Scene))]
  76. public class NumericWatcherComponent : Entity, IAwake, ILoad
  77. {
  78. public static NumericWatcherComponent Instance { get; set; }
  79. public Dictionary<int, List<NumericWatcherInfo>> allWatchers;
  80. }
  81. }