public class AClass : MonoBehaviour
void Start() {
SimpleGameAudios.Instance.mute = !GameData.Instance.GetSound();
EventCentre.Instance.AddListener<SoundEvt>(OnSoundEvt);
}
protected override void GameDestroy() {
EventCentre.Instance.RemoveListener<SoundEvt>(OnSoundEvt);
}
void OnSoundEvt(SoundEvt e){
SimpleGameAudios.Instance.mute = !e.on;
}
}
public class SoundEvt : System.EventArgs {
public bool on;
}
实现
public class EventCentre {
public static readonly EventCentre Instance = new EventCentre();
Dictionary<Type, List<Holder>> dic = new Dictionary<Type, List<Holder>>();
public void AddListener<T>(Action<T> listener)where T : EventArgs {
var t = typeof(T);
var holder = new Holder();
holder.Setup(listener);
AddListener(t, holder);
}
public void RemoveListener<T>(Action<T> listener)where T : EventArgs {
var t = typeof(T);
if (dic.ContainsKey(t)) {
var list = dic[t];
foreach (var holder in list) {
if (object.Equals(holder.raw, listener)) {
list.Remove(holder);
return;
}
}
}
}
void AddListener(Type t, Holder holder) {
if (!dic.ContainsKey(t)) {
dic[t] = new List<Holder>();
}
var handlers = dic[t];
if (!handlers.Contains(holder)) {
handlers.Add(holder);
}
}
public void Dispatch<T>(T e)where T : EventArgs {
var t = typeof(T);
if (dic.ContainsKey(t)) {
var handlers = dic[t];
for (int i = 0; i < handlers.Count; i++) {
handlers[i].ex.Invoke(e);
}
}
}
}
class Holder {
public object raw;
public Action<EventArgs> ex;
public Holder() { }
public void Setup<T>(Action<T> raw)where T : EventArgs {
this.raw = raw;
ex = CreateListener(raw);
}
public static Action<EventArgs> CreateListener<Args>(Action<Args> listener)where Args : EventArgs {
return (args) => {
if (null != listener)
listener.Invoke((Args)args);
};
}
}