| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- using System;
- using System.Collections.Generic;
- namespace ET
- {
- [FriendClass(typeof(NumericWatcherComponent))]
- public static class NumericWatcherComponentSystem
- {
- [ObjectSystem]
- public class NumericWatcherComponentAwakeSystem : AwakeSystem<NumericWatcherComponent>
- {
- public override void Awake(NumericWatcherComponent self)
- {
- NumericWatcherComponent.Instance = self;
- self.Init();
- }
- }
-
- public class NumericWatcherComponentLoadSystem : LoadSystem<NumericWatcherComponent>
- {
- public override void Load(NumericWatcherComponent self)
- {
- self.Init();
- }
- }
- private static void Init(this NumericWatcherComponent self)
- {
- self.allWatchers = new Dictionary<int, List<NumericWatcherInfo>>();
- HashSet<Type> types = Game.EventSystem.GetTypes(typeof(NumericWatcherAttribute));
- foreach (Type type in types)
- {
- object[] attrs = type.GetCustomAttributes(typeof(NumericWatcherAttribute), false);
- foreach (object attr in attrs)
- {
- NumericWatcherAttribute numericWatcherAttribute = (NumericWatcherAttribute)attr;
- INumericWatcher obj = (INumericWatcher)Activator.CreateInstance(type);
- NumericWatcherInfo numericWatcherInfo = new NumericWatcherInfo(numericWatcherAttribute.SceneType, obj);
- if (!self.allWatchers.ContainsKey(numericWatcherAttribute.NumericType))
- {
- self.allWatchers.Add(numericWatcherAttribute.NumericType, new List<NumericWatcherInfo>());
- }
- self.allWatchers[numericWatcherAttribute.NumericType].Add(numericWatcherInfo);
- }
- }
- }
- public static void Run(this NumericWatcherComponent self, Unit unit, EventType.NumbericChange args)
- {
- List<NumericWatcherInfo> list;
- if (!self.allWatchers.TryGetValue(args.NumericType, out list))
- {
- return;
- }
- SceneType unitDomainSceneType = unit.DomainScene().SceneType;
- foreach (NumericWatcherInfo numericWatcher in list)
- {
- if (numericWatcher.SceneType != unitDomainSceneType)
- {
- continue;
- }
- numericWatcher.INumericWatcher.Run(unit, args);
- }
- }
- }
- public class NumericWatcherInfo
- {
- public SceneType SceneType { get; }
- public INumericWatcher INumericWatcher { get; }
- public NumericWatcherInfo(SceneType sceneType, INumericWatcher numericWatcher)
- {
- this.SceneType = sceneType;
- this.INumericWatcher = numericWatcher;
- }
- }
-
-
- /// <summary>
- /// 监视数值变化组件,分发监听
- /// </summary>
- public class NumericWatcherComponent : Entity, IAwake, ILoad
- {
- public static NumericWatcherComponent Instance { get; set; }
-
- public Dictionary<int, List<NumericWatcherInfo>> allWatchers;
- }
- }
|