using System.Collections.Generic; using System; using UnityEngine; namespace BF { public class BFEvent : BFEventBase { public BFEvent() : base(4) { } public BFEvent(int length = 4) : base(length) { } public static BFEvent operator +(BFEvent a, Action b) { a.AddListener(b); return a; } public static BFEvent operator -(BFEvent a, Action b) { a.RemoveListener(b); return a; } public void Invoke() { delegateLength = delegates.Count; for (int i = 0; i < delegateLength; i++) { var del = delegates[i] as Action; if (del != null) { del(); } } } } public class BFEvent : BFEventBase { public BFEvent() : base(4) { } public BFEvent(int length = 4) : base(length) { } public static BFEvent operator +(BFEvent a, Action b) { a.AddListener(b); return a; } public static BFEvent operator -(BFEvent a, Action b) { a.RemoveListener(b); return a; } public void Invoke(T t) { delegateLength = delegates.Count; for (int i = 0; i < delegateLength; i++) { var del = delegates[i] as Action; if (del != null) { del(t); } } } } public class BFEvent : BFEventBase { public BFEvent() : base(4) { } public BFEvent(int length = 4) : base(length) { } public static BFEvent operator +(BFEvent a, Action b) { a.AddListener(b); return a; } public static BFEvent operator -(BFEvent a, Action b) { a.RemoveListener(b); return a; } public void Invoke(T1 t1, T2 t2) { delegateLength = delegates.Count; for (int i = 0; i < delegateLength; i++) { var del = delegates[i] as Action; if (del != null) { del(t1, t2); } } } } public class BFEvent : BFEventBase { public BFEvent() : base(4) { } public BFEvent(int length = 4) : base(length) { } public static BFEvent operator +(BFEvent a, Action b) { a.AddListener(b); return a; } public static BFEvent operator -(BFEvent a, Action b) { a.RemoveListener(b); return a; } public void Invoke(T1 t1, T2 t2, T3 t3) { delegateLength = delegates.Count; for (int i = 0; i < delegateLength; i++) { var del = delegates[i] as Action; if (del != null) { del(t1, t2, t3); } } } } public class BFEventBase { protected List delegates; //暂时用list。可以实现一个无GC得 LinkList 来代替 private bool removed = false; protected int delegateLength; public int CallbackCount() { return delegates.Count; } public BFEventBase(int length) { delegates = new List(length); } public void AddListener(Delegate del) { #if UNITY_EDITOR for (int i = 0; i < delegates.Count; i++) { if (delegates[i] == del) { Debug.LogWarning("重复添加回调 :" + del.ToString()); } } #endif delegates.Add(del); } public void RemoveListener(Delegate del) { var length = delegates.Count; for (int i = 0; i < length; i++) { if (delegates[i] == del) { removed = true; delegates[i] = null; BFMain.Instance.OneShotManager.AddOneShot(Execute); } } } public void Clear() { delegateLength = 0; delegates.Clear(); removed = false; } private void Execute() { if (removed) { removed = false; var length = delegates.Count; for (int i = 0; i < length; i++) { if (delegates[i] == null) { delegates.RemoveAt(i); --i; --length; } } } } } }