整站优化案例,迁西个人网页设计制作软件,推广做网站莱芜,广西建设教育协会网站观察者模式是一种对象行为模式。它定义对象间的一种一对多的依赖关系#xff0c;当一个对象的状态发生改变时#xff0c;所有依赖于它的对象都得到通知并被自动更新。在观察者模式中#xff0c;主体是通知的发布者#xff0c;它发出通知时并不需要知道谁是它的观察者#…观察者模式是一种对象行为模式。它定义对象间的一种一对多的依赖关系当一个对象的状态发生改变时所有依赖于它的对象都得到通知并被自动更新。在观察者模式中主体是通知的发布者它发出通知时并不需要知道谁是它的观察者可以有任意数目的观察者订阅并接收通知。
一、事件中心管理类
继承了一个单例模式基类节省代码
public class EventCenter : BaseManagerEventCenter
{//key —— 事件的名字比如怪物死亡玩家死亡通关 等等//value —— 对应的是 监听这个事件 对应的委托函数们private Dictionarystring, UnityActionobject eventDic new Dictionarystring, UnityActionobject();/// summary/// 添加事件监听/// /summary/// param namename事件的名字/param/// param nameaction准备用来处理事件 的委托函数/parampublic void AddEventListener(string name, UnityActionobject action){//有没有对应的事件监听//有的情况if( eventDic.ContainsKey(name) ){eventDic[name] action;}//没有的情况else{eventDic.Add(name, action);}}/// summary/// 过场景移除对应的事件监听/// /summary/// param namename事件的名字/param/// param nameaction对应之前添加的委托函数/parampublic void RemoveEventListener(string name, UnityActionobject action){if (eventDic.ContainsKey(name))eventDic[name]- action;}/// summary/// 事件触发/// /summary/// param namename/parampublic void EventTrigger(string name,object info){//有没有对应的事件监听//有的情况if (eventDic.ContainsKey(name)){if (eventDic[name]! null)eventDic[name].Invoke(info);}}/// summary/// 清空事件中心/// 主要用在 场景切换时/// /summarypublic void Clear(){eventDic.Clear();}
}
二、模拟一个功能
玩家要完成一个任务“杀死三只哥布林”玩家点击鼠标左键杀死一只怪物如果这个怪物是哥布林那么任务计数加1达到3后提示任务完成。
其中还会显示玩家击杀了什么怪物击杀后获得多少金钱
玩家类
public class Player : MonoBehaviour
{public string name Holens;// Start is called before the first frame updatevoid Start(){EventCenter.GetInstance().AddEventListener(MonsterDead, GetMoney);}// Update is called once per framevoid Update(){//按下左键杀死哥布林if (Input.GetMouseButtonDown(0)){KillMonster();}}public void KillMonster(){//杀死哥布林//向事件中心发送请求 执行杀死哥布林逻辑EventCenter.GetInstance().EventTrigger(KillMonster, this);}public void GetMoney(object info){print(this.name杀死了 (info as Monster).name 获得 (info as Monster).money金钱);}
}
怪物类
public class Monster : MonoBehaviour
{public string name;public int money 100;// Start is called before the first frame updatevoid Start(){//向 击杀哥布林 委托添加死亡函数EventCenter.GetInstance().AddEventListener(KillMonster, Dead);}public void Dead(object info){print((info as Player).name杀死了this.name);//死亡时向事件中心发送请求 执行怪物死亡逻辑EventCenter.GetInstance().EventTrigger(MonsterDead, this);}
}
任务类
public class Task : MonoBehaviour
{public int nowNum;public int maxNum 3;public string messionInfo 杀死三只哥布林;public bool isFinish false;// Start is called before the first frame updatevoid Start(){print(任务目标是 messionInfo);//怪物死亡//向 怪物死亡 委托添加函数当怪物死亡时任务计数加1EventCenter.GetInstance().AddEventListener(MonsterDead, UpdateNum);}// Update is called once per framevoid Update(){if (nowNum maxNum!isFinish){//计数达到目标任务完成FinishMession();isFinish true;}}public void UpdateNum(object info){//如果杀死的目标是哥布林则计数增加if ((info as Monster).name哥布林){nowNum;}}public void FinishMession(){print(任务完成);}
}
三、运行过程及结果
创建三个物体并挂载相应代码 怪物名字设置成1 此时按下鼠标左键五次可以看到触发了提示但是因为杀的不是哥布林所以任务没有完成 将名字改为哥布林点击三次后提示完成任务