金華大企業(yè)網(wǎng)站建設(shè)有哪些小說排行榜百度搜索風(fēng)云榜
觀察者模式是一種對象行為模式。它定義對象間的一種一對多的依賴關(guān)系,當(dāng)一個對象的狀態(tài)發(fā)生改變時,所有依賴于它的對象都得到通知并被自動更新。在觀察者模式中,主體是通知的發(fā)布者,它發(fā)出通知時并不需要知道誰是它的觀察者,可以有任意數(shù)目的觀察者訂閱并接收通知。
一、事件中心管理類
繼承了一個單例模式基類,節(jié)省代碼
public class EventCenter : BaseManager<EventCenter>
{//key —— 事件的名字(比如:怪物死亡,玩家死亡,通關(guān) 等等)//value —— 對應(yīng)的是 監(jiān)聽這個事件 對應(yīng)的委托函數(shù)們private Dictionary<string, UnityAction<object>> eventDic = new Dictionary<string, UnityAction<object>>();/// <summary>/// 添加事件監(jiān)聽/// </summary>/// <param name="name">事件的名字</param>/// <param name="action">準(zhǔn)備用來處理事件 的委托函數(shù)</param>public void AddEventListener(string name, UnityAction<object> action){//有沒有對應(yīng)的事件監(jiān)聽//有的情況if( eventDic.ContainsKey(name) ){eventDic[name]+= action;}//沒有的情況else{eventDic.Add(name, action);}}/// <summary>/// 過場景,移除對應(yīng)的事件監(jiān)聽/// </summary>/// <param name="name">事件的名字</param>/// <param name="action">對應(yīng)之前添加的委托函數(shù)</param>public void RemoveEventListener(string name, UnityAction<object> action){if (eventDic.ContainsKey(name))eventDic[name]-= action;}/// <summary>/// 事件觸發(fā)/// </summary>/// <param name="name"></param>public void EventTrigger(string name,object info){//有沒有對應(yīng)的事件監(jiān)聽//有的情況if (eventDic.ContainsKey(name)){if (eventDic[name]!= null)eventDic[name].Invoke(info);}}/// <summary>/// 清空事件中心/// 主要用在 場景切換時/// </summary>public void Clear(){eventDic.Clear();}
}
二、模擬一個功能
玩家要完成一個任務(wù)“殺死三只哥布林”,玩家點擊鼠標(biāo)左鍵殺死一只怪物,如果這個怪物是哥布林,那么任務(wù)計數(shù)加1,達到3后提示任務(wù)完成。
其中還會顯示玩家擊殺了什么怪物,擊殺后獲得多少金錢
玩家類
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(){//殺死哥布林//向事件中心發(fā)送請求 執(zhí)行殺死哥布林邏輯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(){//向 擊殺哥布林 委托添加死亡函數(shù)EventCenter.GetInstance().AddEventListener("KillMonster", Dead);}public void Dead(object info){print((info as Player).name+"殺死了"+this.name);//死亡時向事件中心發(fā)送請求 執(zhí)行怪物死亡邏輯EventCenter.GetInstance().EventTrigger("MonsterDead", this);}
}
任務(wù)類
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("任務(wù)目標(biāo)是" + messionInfo);//怪物死亡//向 怪物死亡 委托添加函數(shù)(當(dāng)怪物死亡時任務(wù)計數(shù)加1)EventCenter.GetInstance().AddEventListener("MonsterDead", UpdateNum);}// Update is called once per framevoid Update(){if (nowNum == maxNum&&!isFinish){//計數(shù)達到目標(biāo),任務(wù)完成FinishMession();isFinish = true;}}public void UpdateNum(object info){//如果殺死的目標(biāo)是哥布林,則計數(shù)增加if ((info as Monster).name=="哥布林"){nowNum++;}}public void FinishMession(){print("任務(wù)完成");}
}
三、運行過程及結(jié)果
創(chuàng)建三個物體并掛載相應(yīng)代碼
怪物名字設(shè)置成1
此時按下鼠標(biāo)左鍵五次,可以看到觸發(fā)了提示但是因為殺的不是哥布林,所以任務(wù)沒有完成
?將名字改為哥布林,點擊三次后提示完成任務(wù)