【Unity基於C#事件委託機制,最輕鬆易懂的版本,一個例項解決你的困惑】
阿新 • • 發佈:2019-02-14
PS:題主涉世尚淺,如有不對的地方還請大佬指出~
對於C#的委託和事件機制,看似複雜抽象,但其邏輯條理十分清晰,所以理解起來也不會太難,關鍵在於瞭解它兩的聯絡,以及工作原理。
委託
觀察者模式:
定義了物件之間的一對多依賴,這樣一來,當一個物件改變狀態時,它的所有依賴者都會收到通知並自動更新。
什麼是委託:
C#語言通過委託來實現回撥函式的機制,而回調函式是一種很有用的程式設計機制,可以被廣泛的用在觀察者模式中。
委託的作用:
實現unity訊息機制,回撥函式。
事件
事件機制廣泛應用於mvc模式中,靈活的事件機制能夠彌補Unity中的一些缺陷,比如協程的執行。因為協程不能返回值,也不能通過out或者ref傳遞。通過事件機制,可以知道協程執行進度並且返回執行結果。
主攝像機掛載Controller
新建三個空物體,新建一個員工類Employee,分別掛在3個員工空物體上。
using UnityEngine;
using System.Collections;
public class Controller : MonoBehaviour {
public static Controller _instance;
public delegate void OnClikEvent(int money); //定義委託 OnClikEvent是公司HR發的聚餐活動公告 ,只要願意去的必須繳納money元的費用
public event OnClikEvent OnClik; //定義事件 OnClik是一個基於本次活動的簽到表,只要簽到了就表示要去這次聚餐活動,就得繳納費用。
void Awake()
{
_instance = this;
}
void Update () { //收錢
if (Input.GetKeyDown(KeyCode.Space))
{ //按下空格鍵,表示HR在這裡進行統一收錢,收所有已經簽到了的同事的錢。(也就是已經註冊OnClik事件的付款方法)。
if (OnClik!=null){//OnClik相當於一個集合,每一個註冊OnClik的方法都成為它的元素。
OnClik(100); //HR規定收款金額
Debug.Log("收款完畢!");
}
}
}
}
Employee類
using UnityEngine;
using System.Collections;
using System;
public class Employee : MonoBehaviour { //員工類
[SerializeField]private new string name; //員工名字
void Start () {
Controller._instance.OnClik +=PayOnEvent; //註冊事件,當前員工報名填表了
}
void PayOnEvent(int money) //付錢的方法
{
Debug.Log("我是"+name+",成功付款:-"+money+" 元");
}
void OnDisable() //當被禁用或者被銷燬時呼叫 //移除事件,當前員工反悔不去了。//那麼小明不在OnClik事件中了,所以總部收不了他的錢
{
Controller._instance.OnClik -= PayOnEvent;
Debug.Log("我是" + name + ",我有事情就不去了!");
}
}
輸出結果
移除2個員工