1.事件的定义
- 声明事件委托。
- 声明事件。
- 添加事件的触发方法。
- 添加事件的处理程序(响应事件的方法)。
- 将指定的事件处理程序邦定到要处理的事件上(订阅事件)。
- 用户信息操作,并触发事件(调用事件的触发方法)。
- 通过事件委托的回调,执行我们需要的事件处理程序。
2.简单示例
using System;
namespace ConsoleApplication1
{
class Program
{
public delegate void MyDelegate();//声明事件委托
public static event MyDelegate MyEvent;//声明事件
static void Main(string[] args)
{
TestEvent myClass = new TestEvent();//这里构造类时先调用了TestEvent中的事件订阅
MyEvent += TestDelegate1; //订阅事件
OnTestEvent();
Console.ReadKey();
}
//事件触发方法 static 是为了能在Main中调用
static void OnTestEvent()
{
if (MyEvent != null)
MyEvent();
}
//定义处理事件的方法,他与声明事件的delegate具有相同的参数和返回值类型
static void TestDelegate1()
{
Console.WriteLine("委托事件1");
}
}
public class TestEvent
{
public TestEvent()
{
Program.MyEvent += TestDelegate2;//订阅事件
}
//定义处理事件的方法,他与声明事件的delegate具有相同的参数和返回值类型
public void TestDelegate2()
{
Console.WriteLine("委托事件2");
}
}
}
结果:
3.Unity 中的应用示例
- unity 中玩家穿脱装备引起的属性变化
using UnityEngine;
using System.Collections;
//该类负责UI界面中人物血条的更新
public class UIHpClass
{
//绑定事件
public void AddEventListener()
{
T_005_Event_Test.OnInventoryChangeEvent += UpdateHp;
}
public void UpdateHp()
{
Debug.Log("更新人物血量显示");
}
}
//该类负责UI界面中人物属性面板的数值更新
public class UIPlayerProperty
{
//绑定事件
public void AddEventListener()
{
T_005_Event_Test.OnInventoryChangeEvent += UpdateProperty;
}
public void UpdateProperty()
{
Debug.Log("更新人物属性面板的数值显示");
}
}
//该类负责记录人物信息,并将人物信息上传至数据库
public class PlayerInfo
{
//绑定事件
public void AddEventListener()
{
T_005_Event_Test.OnInventoryChangeEvent += UpdatePlayerInfo;
}
//更新数据库中人物信息
public void UpdatePlayerInfo()
{
Debug.Log("人物信息更新,已上传至数据库");
}
}
public class T_005_Event_Test : MonoBehaviour
{
public delegate void OnInventoryChangeDalegate();//声明事件委托
public static event OnInventoryChangeDalegate OnInventoryChangeEvent;//声明事件
void Awake()
{
PlayerInfo palyerInfo = new PlayerInfo();
palyerInfo.AddEventListener();
UIHpClass uiHp = new UIHpClass();
uiHp.AddEventListener();
UIPlayerProperty playerProperty = new UIPlayerProperty();
playerProperty.AddEventListener();
}
void Start()
{
PlayerChangeEquip(true,"龙鳞宝刀");
}
//控制玩家穿上/脱下装备
public void PlayerChangeEquip(bool isEquip,string message)
{
if (isEquip)
Debug.Log("玩家穿上装备: " + message);
else
Debug.Log("玩家脱下装备: " + message);
//只要人物穿上/脱下装备,我们就通过OnInventoryChangeEvent事件去更新人物信息及UI界面的数据显示
OnInventoryChangeEvent();
}
}