206 lines
5.0 KiB
C#
206 lines
5.0 KiB
C#
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<T> : BFEventBase
|
|
{
|
|
public BFEvent() : base(4) { }
|
|
|
|
public BFEvent(int length = 4) : base(length) { }
|
|
|
|
public static BFEvent<T> operator +(BFEvent<T> a, Action<T> b)
|
|
{
|
|
a.AddListener(b);
|
|
return a;
|
|
}
|
|
|
|
public static BFEvent<T> operator -(BFEvent<T> a, Action<T> 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<T>;
|
|
if (del != null)
|
|
{
|
|
del(t);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public class BFEvent<T1, T2> : BFEventBase
|
|
{
|
|
public BFEvent() : base(4) { }
|
|
|
|
public BFEvent(int length = 4) : base(length) { }
|
|
|
|
public static BFEvent<T1, T2> operator +(BFEvent<T1, T2> a, Action<T1, T2> b)
|
|
{
|
|
a.AddListener(b);
|
|
return a;
|
|
}
|
|
|
|
public static BFEvent<T1, T2> operator -(BFEvent<T1, T2> a, Action<T1, T2> 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<T1, T2>;
|
|
if (del != null)
|
|
{
|
|
del(t1, t2);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public class BFEvent<T1, T2, T3> : BFEventBase
|
|
{
|
|
public BFEvent() : base(4) { }
|
|
|
|
public BFEvent(int length = 4) : base(length) { }
|
|
|
|
public static BFEvent<T1, T2, T3> operator +(BFEvent<T1, T2, T3> a, Action<T1, T2, T3> b)
|
|
{
|
|
a.AddListener(b);
|
|
return a;
|
|
}
|
|
|
|
public static BFEvent<T1, T2, T3> operator -(BFEvent<T1, T2, T3> a, Action<T1, T2, T3> 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<T1, T2, T3>;
|
|
if (del != null)
|
|
{
|
|
del(t1, t2, t3);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public class BFEventBase
|
|
{
|
|
protected List<Delegate> delegates; //暂时用list。可以实现一个无GC得 LinkList 来代替
|
|
private bool removed = false;
|
|
protected int delegateLength;
|
|
|
|
public int CallbackCount()
|
|
{
|
|
return delegates.Count;
|
|
}
|
|
|
|
public BFEventBase(int length)
|
|
{
|
|
delegates = new List<Delegate>(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;
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|