工具类:能避免重复挂载事件 用来代替默认的事件
using System;
namespace Utils
{
/// <summary>
/// 能避免重复挂事件的默认委托
/// </summary>
public struct SafeAction
{
Action act;
public static implicit operator Action(SafeAction a)
{
return a.act;
}
public static implicit operator SafeAction(Action a)
{
SafeAction res = new SafeAction();
res.act = a;
return res;
}
public static SafeAction operator +(SafeAction a, Action b)
{
a.act -= b;
SafeAction res = new SafeAction();
res.act = a.act + b;
return res;
}
public static SafeAction operator -(SafeAction a, Action b)
{
SafeAction res = new SafeAction();
res.act = a.act - b;
return res;
}
public void SafeInvoke()
{
act.SafeInvoke();
}
public bool IsNull
{
get
{
return act == null;
}
}
public void Dispose()
{
act = null;
}
}
/// <summary>
/// 能避免重复挂事件的默认委托
/// </summary>
public struct SafeAction<T>
{
Action<T> act;
public static implicit operator Action<T>(SafeAction<T> a)
{
return a.act;
}
public static implicit operator SafeAction<T>(Action<T> a)
{
SafeAction<T> res = new SafeAction<T>();
res.act = a;
return res;
}
public static SafeAction<T> operator +(SafeAction<T> a, Action<T> b)
{
a.act -= b;
SafeAction<T> res = new SafeAction<T>();
res.act = a.act + b;
return res;
}
public static SafeAction<T> operator -(SafeAction<T> a, Action<T> b)
{
SafeAction<T> res = new SafeAction<T>();
res.act = a.act - b;
return res;
}
public void SafeInvoke(T param)
{
act.SafeInvoke(param);
}
public bool IsNull
{
get
{
return act == null;
}
}
public void Dispose()
{
act = null;
}
}
/// <summary>
/// 能避免重复挂事件的默认委托
/// </summary>
public struct SafeAction<T, T2>
{
Action<T, T2> act;
public static implicit operator Action<T, T2>(SafeAction<T, T2> a)
{
return a.act;
}
public static implicit operator SafeAction<T, T2>(Action<T, T2> a)
{
SafeAction<T, T2> res = new SafeAction<T, T2>();
res.act = a;
return res;
}
public static SafeAction<T, T2> operator +(SafeAction<T, T2> a, Action<T, T2> b)
{
a.act -= b;
SafeAction<T, T2> res = new SafeAction<T, T2>();
res.act = a.act + b;
return res;
}
public static SafeAction<T, T2> operator -(SafeAction<T, T2> a, Action<T, T2> b)
{
SafeAction<T, T2> res = new SafeAction<T, T2>();
res.act = a.act - b;
return res;
}
public void SafeInvoke(T param, T2 param2)
{
act.SafeInvoke(param, param2);
}
public bool IsNull
{
get
{
return act == null;
}
}
public void Dispose()
{

这段代码提供了一组结构体SafeAction和SafeFunc,用于在C#中创建能够防止重复挂载事件的委托。这些结构体支持隐式转换和加减操作,确保事件处理函数的正确添加和移除。通过这种方式,可以有效地管理玩家等级变化引起的UI更新、怪物生成数量变化等事件。PlayerController类监听玩家等级变化,而SceneManager和GameUI类则根据等级变化做出相应反应。
最低0.47元/天 解锁文章
3133

被折叠的 条评论
为什么被折叠?



