EventHandler 是事件定義的的一種,它擁有兩個參數,一個是Object 類型的sender , 另 一個是繼承自EvebtArgs的參數e,一般它的寫法如下:
using UnityEngine;
using System.Collections;
using System;
/// <summary>
/// 定義事件的類。
/// 其中NewCarInfo代表事件名,它的作用是註冊它所觸發的事件方法
/// RaiseNewCarInfo方法的作用修飾NewCarInfo並將這個類與目標數據類關聯起來(具體什麼作用我也不清楚)
/// </summary>
public class MyTestScript {
public event EventHandler<CarInfoEventArgs> NewCarInfo;
public void NewCar(string car)
{
Debug.Log("CarDealer,new car" + car);
RaiseNewCarInfo(car);
}
protected virtual void RaiseNewCarInfo(string car)
{
EventHandler<CarInfoEventArgs> newCarInfo = NewCarInfo;
if(newCarInfo!= null)
{
newCarInfo(this, new CarInfoEventArgs(car));
}
}
}
//這個類是繼承EventArgs,用來存儲數據
public class CarInfoEventArgs : EventArgs
{
public CarInfoEventArgs(string car)
{
this.Car = car;
}
public string Car { get; set; }
}
下面我們再來定義一個訂戶的類,即訂閱上面這個事件的客戶類,它擁有一些行爲,而且它一般會有多個實例,將它們實例的行爲註冊進入上文事件類NewCarInfo中後,就可以統一給所有註冊過事件的實例發消息了,並控制這些實例什麼時候做什麼事情。具體如下:
/// <summary>
/// 客戶類的定義,它擁有一個名字屬性,以及一個NewCarIsHere方法
/// NewCarIsHere方法帶有2個參數,這兩個參數一定要與事件類中的EventHandler的參數一致,因爲這個方法是要註冊到事件中的
/// NewCarIsHere內的行爲就是客戶類的行爲。
/// </summary>
public class TheCustomer
{
private string name;
public TheCustomer(string name)
{
this.name = name;
}
public void NewCarIsHere(object sender, CarInfoEventArgs e)
{
Debug.Log(name + "car" + e.Car + "is new");
}
}```
既然事件定義類和客戶類都已經定義完畢,下面就是程序的主體部分。
首先將事件類和客戶類都實例化,並且多實例幾個客戶類,將這些客戶類的方法都註冊進入事件類的實例中。此時,只要調用一次事件類實例中NewCar的方法,就可以將所有註冊過的客戶類實例的方法都執行一遍。具體如下:
public class Customer : MonoBehaviour {
void Start()
{
MyTestScript dealer = new MyTestScript(); //建立一個事件類的實例
TheCustomer mao = new TheCustomer("Mao");//建立一個客戶類的實例
dealer.NewCarInfo += mao.NewCarIsHere;//將客戶類的一個方法註冊進事件類中
dealer.NewCar("Ferrari"); //給所有註冊了事件類的客戶類發消息,通知他們執行自己的方法,即NewCarIsHere
TheCustomer lu = new TheCustomer("Lu");//再建立一個客戶類的實例
dealer.NewCarInfo += lu.NewCarIsHere;//將這個新客戶類的方法也註冊到之前的事件類中
dealer.NewCar("Mercedes");//給所有註冊了事件類的客戶類發消息,通知他們執行自己的方法,即NewCarIsHere
dealer.NewCarInfo -= mao.NewCarIsHere;//把第一個客戶類的實例的方法刪掉
dealer.NewCar("Red Bull Racing");//再次通知,因爲此時事件類中已經註冊的客戶只剩下Lu了,所以只會有lu的方法會被執行
}
}“`