2023-04-03 11:04:31 +08:00

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;
}
}
}
}
}
}