Unity中用到的C#补充(七)- 委托与事件

来源:互联网 发布:有了阿里云ems如何建站 编辑:程序博客网 时间:2024/06/06 00:01

1.事件的定义

  1. 声明事件委托。
  2. 声明事件。
  3. 添加事件的触发方法。
  4. 添加事件的处理程序(响应事件的方法)。
  5. 将指定的事件处理程序邦定到要处理的事件上(订阅事件)。
  6. 用户信息操作,并触发事件(调用事件的触发方法)。
  7. 通过事件委托的回调,执行我们需要的事件处理程序。

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();    }}
0 0