1. 程式人生 > >【Unity基於C#事件委託機制,最輕鬆易懂的版本,一個例項解決你的困惑】

【Unity基於C#事件委託機制,最輕鬆易懂的版本,一個例項解決你的困惑】

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個員工
這裡寫圖片描述