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的方法会被执行
}
}“`