结构: public struct SafeAction ---对系统的Action加工 public static class EventsExtension ---对系统Event扩展 外界一个事件中心控制 namespace GameEvent
============事件系统================== 结构: public struct SafeAction ---对系统的Action加工 public static class EventsExtension ---对系统Event扩展 外界一个事件中心控制 namespace GameEvent using System; namespace Utils { /// <summary> /// 能避免重复挂事件的默认委托 /// </summary> public struct SafeAction { Action act; //implicit:数据类型的隐式转换 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; } //operator:运算符重载 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; } //调用Invoke================================= 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() { act = null; } } /// <summary> /// 能避免重复挂事件的默认委托 /// </summary> public struct SafeAction<T, T2, T3> { Action<T, T2, T3> act; public static implicit operator Action<T, T2, T3>(SafeAction<T, T2, T3> a) { return a.act; } public static implicit operator SafeAction<T, T2, T3>(Action<T, T2, T3> a) { SafeAction<T, T2, T3> res = new SafeAction<T, T2, T3>(); res.act = a; return res; } public static SafeAction<T, T2, T3> operator +(SafeAction<T, T2, T3> a, Action<T, T2, T3> b) { a.act -= b; SafeAction<T, T2, T3> res = new SafeAction<T, T2, T3>(); res.act = a.act + b; return res; } public static SafeAction<T, T2, T3> operator -(SafeAction<T, T2, T3> a, Action<T, T2, T3> b) { SafeAction<T, T2, T3> res = new SafeAction<T, T2, T3>(); res.act = a.act - b; return res; } public void SafeInvoke(T param, T2 param2, T3 param3) { act.SafeInvoke(param, param2, param3); } public bool IsNull { get { return act == null; } } public void Dispose() { act = null; } } /// <summary> /// 能避免重复挂事件的默认委托 /// </summary> public struct SafeAction<T, T2, T3, T4> { Action<T, T2, T3, T4> act; public static implicit operator Action<T, T2, T3, T4>(SafeAction<T, T2, T3, T4> a) { return a.act; } public static implicit operator SafeAction<T, T2, T3, T4>(Action<T, T2, T3, T4> a) { SafeAction<T, T2, T3, T4> res = new SafeAction<T, T2, T3, T4>(); res.act = a; return res; } public static SafeAction<T, T2, T3, T4> operator +(SafeAction<T, T2, T3, T4> a, Action<T, T2, T3, T4> b) { a.act -= b; SafeAction<T, T2, T3, T4> res = new SafeAction<T, T2, T3, T4>(); res.act = a.act + b; return res; } public static SafeAction<T, T2, T3, T4> operator -(SafeAction<T, T2, T3, T4> a, Action<T, T2, T3, T4> b) { SafeAction<T, T2, T3, T4> res = new SafeAction<T, T2, T3, T4>(); res.act = a.act - b; return res; } public void SafeInvoke(T param, T2 param2, T3 param3, T4 param4) { act.SafeInvoke(param, param2, param3,param4); } public bool IsNull { get { return act == null; } } public void Dispose() { act = null; } } /// <summary> /// 能避免重复挂事件的默认委托 /// </summary> public struct SafeAction<T, T2, T3, T4, T5> { Action<T, T2, T3, T4, T5> act; public static implicit operator Action<T, T2, T3, T4, T5>(SafeAction<T, T2, T3, T4, T5> a) { return a.act; } public static implicit operator SafeAction<T, T2, T3, T4, T5>(Action<T, T2, T3, T4, T5> a) { SafeAction<T, T2, T3, T4, T5> res = new SafeAction<T, T2, T3, T4, T5>(); res.act = a; return res; } public static SafeAction<T, T2, T3, T4, T5> operator +(SafeAction<T, T2, T3, T4, T5> a, Action<T, T2, T3, T4, T5> b) { a.act -= b; SafeAction<T, T2, T3, T4, T5> res = new SafeAction<T, T2, T3, T4, T5>(); res.act = a.act + b; return res; } public static SafeAction<T, T2, T3, T4, T5> operator -(SafeAction<T, T2, T3, T4, T5> a, Action<T, T2, T3, T4, T5> b) { SafeAction<T, T2, T3, T4, T5> res = new SafeAction<T, T2, T3, T4, T5>(); res.act = a.act - b; return res; } public void SafeInvoke(T param, T2 param2, T3 param3, T4 param4, T5 param5) { act.SafeInvoke(param, param2, param3, param4, param5); } public bool IsNull { get { return act == null; } } public void Dispose() { act = null; } } /// <summary> /// 能避免重复挂事件的默认委托 /// </summary> public struct SafeFunc<T> { Func<T> act; public static implicit operator Func<T>(SafeFunc<T> a) { return a.act; } public static implicit operator SafeFunc<T>(Func<T> a) { SafeFunc<T> res = new SafeFunc<T>(); res.act = a; return res; } public static SafeFunc<T> operator +(SafeFunc<T> a, Func<T> b) { a.act -= b; SafeFunc<T> res = new SafeFunc<T>(); res.act = a.act + b; return res; } public static SafeFunc<T> operator -(SafeFunc<T> a, Func<T> b) { SafeFunc<T> res = new SafeFunc<T>(); res.act = a.act - b; return res; } public T SafeInvoke() { return act.SafeInvoke(); } public bool IsNull { get { return act == null; } } public void Dispose() { act = null; } } /// <summary> /// 能避免重复挂事件的默认委托 /// </summary> public struct SafeFunc<T, T2> { Func<T, T2> act; public static implicit operator Func<T, T2>(SafeFunc<T, T2> a) { return a.act; } public static implicit operator SafeFunc<T, T2>(Func<T, T2> a) { SafeFunc<T, T2> res = new SafeFunc<T, T2>(); res.act = a; return res; } public static SafeFunc<T, T2> operator +(SafeFunc<T, T2> a, Func<T, T2> b) { a.act -= b; SafeFunc<T, T2> res = new SafeFunc<T, T2>(); res.act = a.act + b; return res; } public static SafeFunc<T, T2> operator -(SafeFunc<T, T2> a, Func<T, T2> b) { SafeFunc<T, T2> res = new SafeFunc<T, T2>(); res.act = a.act - b; return res; } public T2 SafeInvoke(T param) { return act.SafeInvoke(param); } public bool IsNull { get { return act == null; } } public void Dispose() { act = null; } } /// <summary> /// 能避免重复挂事件的默认委托 /// </summary> public struct SafeFunc<T, T2, T3> { Func<T, T2, T3> act; public static implicit operator Func<T, T2, T3>(SafeFunc<T, T2, T3> a) { return a.act; } public static implicit operator SafeFunc<T, T2, T3>(Func<T, T2, T3> a) { SafeFunc<T, T2, T3> res = new SafeFunc<T, T2, T3>(); res.act = a; return res; } public static SafeFunc<T, T2, T3> operator +(SafeFunc<T, T2, T3> a, Func<T, T2, T3> b) { a.act -= b; SafeFunc<T, T2, T3> res = new SafeFunc<T, T2, T3>(); res.act = a.act + b; return res; } public static SafeFunc<T, T2, T3> operator -(SafeFunc<T, T2, T3> a, Func<T, T2, T3> b) { SafeFunc<T, T2, T3> res = new SafeFunc<T, T2, T3>(); res.act = a.act - b; return res; } public T3 SafeInvoke(T param, T2 param2) { return act.SafeInvoke(param, param2); } public bool IsNull { get { return act == null; } } public void Dispose() { act = null; } } /// <summary> /// 能避免重复挂事件的默认委托 /// </summary> public struct SafeFunc<T, T2, T3, T4> { Func<T, T2, T3, T4> act; public static implicit operator Func<T, T2, T3, T4>(SafeFunc<T, T2, T3, T4> a) { return a.act; } public static implicit operator SafeFunc<T, T2, T3, T4>(Func<T, T2, T3, T4> a) { SafeFunc<T, T2, T3, T4> res = new SafeFunc<T, T2, T3, T4>(); res.act = a; return res; } public static SafeFunc<T, T2, T3, T4> operator +(SafeFunc<T, T2, T3, T4> a, Func<T, T2, T3, T4> b) { a.act -= b; SafeFunc<T, T2, T3, T4> res = new SafeFunc<T, T2, T3, T4>(); res.act = a.act + b; return res; } public static SafeFunc<T, T2, T3, T4> operator -(SafeFunc<T, T2, T3, T4> a, Func<T, T2, T3, T4> b) { SafeFunc<T, T2, T3, T4> res = new SafeFunc<T, T2, T3, T4>(); res.act = a.act - b; return res; } public T4 SafeInvoke(T param, T2 param2, T3 param3) { return act.SafeInvoke(param, param2, param3); } public bool IsNull { get { return act == null; } } public void Dispose() { act = null; } } /// <summary> /// 能避免重复挂事件的默认委托 /// </summary> public struct SafeFunc<T, T2, T3, T4, T5> { Func<T, T2, T3, T4, T5> act; public static implicit operator Func<T, T2, T3, T4, T5>(SafeFunc<T, T2, T3, T4, T5> a) { return a.act; } public static implicit operator SafeFunc<T, T2, T3, T4, T5>(Func<T, T2, T3, T4, T5> a) { SafeFunc<T, T2, T3, T4, T5> res = new SafeFunc<T, T2, T3, T4, T5>(); res.act = a; return res; } public static SafeFunc<T, T2, T3, T4, T5> operator +(SafeFunc<T, T2, T3, T4, T5> a, Func<T, T2, T3, T4, T5> b) { a.act -= b; SafeFunc<T, T2, T3, T4, T5> res = new SafeFunc<T, T2, T3, T4, T5>(); res.act = a.act + b; return res; } public static SafeFunc<T, T2, T3, T4, T5> operator -(SafeFunc<T, T2, T3, T4, T5> a, Func<T, T2, T3, T4, T5> b) { SafeFunc<T, T2, T3, T4, T5> res = new SafeFunc<T, T2, T3, T4, T5>(); res.act = a.act - b; return res; } public T5 SafeInvoke(T param, T2 param2, T3 param3, T4 param4) { return act.SafeInvoke(param, param2, param3, param4); } public bool IsNull { get { return act == null; } } public void Dispose() { act = null; } } } using UnityEngine; using System.Collections; using System; namespace Utils { public delegate void Action<T, T2, T3, T4, T5>(T obj, T2 obj2, T3 obj3, T4 obj4, T5 obj5); public static class EventsExtension { //无返回值 public static void SafeInvoke(this Action evt) { if (evt != null) evt(); } public static void SafeInvoke<T>(this Action<T> evt, T arg) { if (evt != null) evt(arg); } public static void SafeInvoke<T, T2>(this Action<T, T2> evt, T arg, T2 arg2) { if (evt != null) evt(arg, arg2); } public static void SafeInvoke<T, T2, T3>(this Action<T, T2, T3> evt, T arg, T2 arg2, T3 arg3) { if (evt != null) evt(arg, arg2, arg3); } public static void SafeInvoke<T, T2, T3, T4>(this Action<T, T2, T3, T4> evt, T arg, T2 arg2, T3 arg3, T4 arg4) { if (evt != null) evt(arg, arg2, arg3, arg4); } public static void SafeInvoke<T, T2, T3, T4, T5>(this Action<T, T2, T3, T4, T5> evt, T arg, T2 arg2, T3 arg3, T4 arg4, T5 arg5) { if (evt != null) evt(arg, arg2, arg3, arg4, arg5); } //有返回值 public static T SafeInvoke<T>(this Func<T> evt) { if (evt != null) return evt(); else return default(T); } public static T2 SafeInvoke<T, T2>(this Func<T, T2> evt, T arg) { if (evt != null) return evt(arg); else return default(T2); } public static T3 SafeInvoke<T, T2, T3>(this Func<T, T2, T3> evt, T arg, T2 arg2) { if (evt != null) return evt(arg, arg2); else return default(T3); } public static T4 SafeInvoke<T, T2, T3, T4>(this Func<T, T2, T3, T4> evt, T arg, T2 arg2, T3 arg3) { if (evt != null) return evt(arg, arg2, arg3); else return default(T4); } public static T5 SafeInvoke<T, T2, T3, T4, T5>(this Func<T, T2, T3, T4, T5> evt, T arg, T2 arg2, T3 arg3, T4 arg4) { if (evt != null) return evt(arg, arg2, arg3, arg4); else return default(T5); } } } ================事件中心================================= using UnityEngine; using System.Collections; using Utils; using System; //1: 定义事件 //2:给事件注入方法(可以多个方法) //3:调用事件 namespace GameEvent { public static class UI//ui模块事件 { public static SafeFunc<int> EventRuturnOne; } public static class Map//地图模块事件 { } public static class Player//人物模块事件 { //等级发生变化之后的事件 public static SafeAction<int> EventLevelChange; } } ============================================================== 实例: 实现当人物等级 提升,相应的人物头顶等级,左上角头像UI人物等级 属性面板的属性值,怪物生成的个数随等级增加个数也增加 GameEvent.Player.EventLevelChange += updateLevel; //UI界面,头像等都有这个个函数 void updateLevel(int level) { text.text = level.ToString(); } GameEvent.Player.EventLevelChange += createMonsterOnMap; //怪物生成 private void createMonsterOnMap(int level) { StartCoroutine(createMonster(level)); } IEnumerator createMonster(int level) { for(int i=0;i<level*2;i++) { //产生怪物(解决思路,要对象池) GameObject.Instantiate(prefabEnemy);//比较消耗性能 yield return new WaitForSeconds(0.2f); } }