using System;
using System.Collections.Generic;
namespace ET
{
public struct NumericWatcherInfo
{
public int SceneType { get; }
public INumericWatcher INumericWatcher { get; }
public NumericWatcherInfo(int sceneType, INumericWatcher numericWatcher)
{
this.SceneType = sceneType;
this.INumericWatcher = numericWatcher;
}
}
///
/// 监视数值变化组件,分发监听
///
[CodeProcess]
public class NumericWatcherComponent : Singleton, ISingletonAwake
{
private readonly Dictionary> allWatchers = new();
public void Awake()
{
HashSet types = CodeTypes.Instance.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(numericWatcherAttribute.SceneType, obj);
if (!this.allWatchers.ContainsKey(numericWatcherAttribute.NumericType))
{
this.allWatchers.Add(numericWatcherAttribute.NumericType, new List());
}
this.allWatchers[numericWatcherAttribute.NumericType].Add(numericWatcherInfo);
}
}
}
public void Run(Unit unit, NumbericChange args)
{
List list;
if (!this.allWatchers.TryGetValue(args.NumericType, out list))
{
return;
}
int unitDomainSceneType = unit.IScene.SceneType;
foreach (NumericWatcherInfo numericWatcher in list)
{
if (!SceneTypeSingleton.IsSame(numericWatcher.SceneType, unitDomainSceneType))
{
continue;
}
numericWatcher.INumericWatcher.Run(unit, args);
}
}
}
}