工具类:能避免重复挂载事件 用来代替默认的事件
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()
{
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;
}
}
}
想要实现的效果:
玩家等级变化—> 界面UI变化 / 怪物生成数量变化 /
事件的总类:
与事件相关联的方法的参数类型必须一致, 这里传入的皆为玩家的等级
因为所有事件的触发条件都是玩家等级的变化。
namespace EventCenter
{
public static class Player
{
public static SafeAction<int> LevelChange;
}
public static class UI
{
public static SafeAction<PlayerInfo> UpdatePlayerInfo;
}
}
玩家信息类 : 用来存储玩家数据
PlayerInfo做成一个单例 , level写一个属性, 每次调用set方法时就会调用事件里面的方法。事件里面的方法就是UI和怪物生成数量变化的方法。
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerInfo
{
public int level;
public int Level
{
get
{
return level;
}
set
{
level = value;
//调用委托里面的方法
EventCenter.Player.LevelChange.SafeInvoke(level);
}
}
public int hp;
private static PlayerInfo playerInfo;
public static PlayerInfo Ins()
{
if (playerInfo == null)
{
playerInfo = new PlayerInfo();
}
return playerInfo;
}
public PlayerInfo()
{
level = 1;
UpdateStatus(level);
}
public void UpdateStatus(int level)
{
Debug.Log("UpdateStatus");
this.level = level;
hp = 10 + level * 2;
EventCenter.UI.UpdatePlayerInfo.SafeInvoke(this);
}
}
PlayerController类:
主要就是写等级变化的触发条件:
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour
{
void Start()
{
EventCenter.Player.LevelChange += PlayerInfo.Ins().UpdateStatus;
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
PlayerInfo.Ins().Level++;
print("level= " + PlayerInfo.Ins().level);
}
}
private void OnDestroy()
{
EventCenter.Player.LevelChange -= PlayerInfo.Ins().UpdateStatus;
}
}
SceneManager类: 根据玩家等级的变化生成怪物数量。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SceneManager :MonoBehaviour
{
GameObject prefabMonster;
private void Start()
{
prefabMonster = Resources.Load<GameObject>("Monster");
EventCenter.Player.LevelChange += CreateMonster;
}
void CreateMonster(int lv)
{
for (int i = 0; i < lv; i++)
{
Instantiate(prefabMonster);
}
}
private void Update()
{
}
private void OnDestroy()
{
EventCenter.Player.LevelChange -= CreateMonster;
}
}
GameUI类: 界面UI等级数字的变化
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class GameUI : MonoBehaviour
{
Text level;
public void UpdateLevel(int lv)
{
level.text = lv.ToString();
}
void Start()
{
level = transform.Find("Level").GetComponent<Text>();
EventCenter.Player.LevelChange += UpdateLevel;
}
void Update()
{
}
private void OnDestroy()
{
EventCenter.Player.LevelChange -= UpdateLevel;
}
}