博客
关于我
[Unity&C#&事件委托]对委托事件的学习与实践
阅读量:465 次
发布时间:2019-03-06

本文共 2472 字,大约阅读时间需要 8 分钟。

Unity 中委托事件的实现与多路广播机制

委托事件(Delegate Event)是 Unity 中一个非常重要的编程概念,用于在不直接暴露对象的过程中传递函数或动作。通过委托,开发者可以以更灵活的方式管理对象间的关系,例如响应事件或执行某些动作。以下将从理论到实际的角度,详细解释委托事件的实现方式及其在项目中的应用。


1. 通过参考资料进行测试

我们从一个简单的例子开始,了解如何配置委托对象。

T_Delegate_Event 脚本中,编写以下代码:

using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.UI;public class T_Delegate_Event : MonoBehaviour {    // 委托定义    private delegate void DebugString(string debug_str);    // 输出中文名字的方法    public void DebugNameOfCN(string str)    {        Debug.Log("中文名字:" + str);    }    // 输出英文名字的方法    public void DebugNameOfEN(string str)    {        Debug.Log("EN Name: " + str);    }    // 委托变量定义    private DebugString HandlerDebugString;    // 调用 DebugNameOfCN    public void DebugEventButon_1()    {        HandlerDebugString = DebugNameOfCN;        HandlerDebugString("尼古拉斯 赵思");    }    // 调用 DebugNameOfEN    public void DebugEventButon_2()    {        HandlerDebugString = DebugNameOfEN;        HandlerDebugString("Nicholas Zhao four");    }}

测试结果

按下分别对应的按钮,会显示以下结果:

  • 点击 DebugEventButon_1:显示 "中文名字:尼古拉斯 赵思"
  • 点击 DebugEventButon_2:显示 "EN Name: Nicholas Zhao four"

  • 2. 测试委托事件的多路广播

    为了实现多路广播(multicast),我们需要在 Start 函数中对委托对象进行操作。

    void Start(){    // 赋值委托对象并调用 DebugNameOfCN    HandlerDebugString = DebugNameOfCN;    HandlerDebugString("1***尼古拉斯 赵思");    Debug.Log("............................");    // 给委托对象添加一个新的事件 DebugNameOfEN    HandlerDebugString += DebugNameOfEN;    HandlerDebugString("2***Nicholas Zhao four");    Debug.Log("............................");    // 调用多个事件    HandlerDebugString("3***尼古拉斯 赵思");    Debug.Log("............................");    // 从委托对象移除 DebugNameOfCN    HandlerDebugString -= DebugNameOfCN;    HandlerDebugString("4***Nicholas Zhao four");}

    实现结果

  • 初始状态:没有添加事件,点击按钮无效。
  • 归属多路广播:当一个事件被加到委托对象时,它将成为多路广播接收器,能够接收所有指定的函数。

  • 与原有代码的对比

    原代码中 += 的使用

    HandlerDebugString += DebugNameOfEN;

    修改后的代码

    HandlerDebugString = DebugNameOfEN;

    通过对 += 修改为直接赋值的方式,更好地体现了多路广播的实现过程。


    3. 委托事件与类声明的关系

    在代码中,委托事件的实际表现方式与类的声明非常接近:

    // 委托声明private delegate void DebugString(string debug_str);// 委托变量private DebugString HandlerDebugString;

    这与类声明的基本形式非常类似,通过委托的方式实现了偏离对象的直接观察。


    4. 事件的多态性

    委托事件的最大优势在于其支持多路广播的特性。通过将多个函数加到同一个委托对象上,系统可以自行管理函数之间的调用顺序(在 MonoBehavior 中通常是调用顺序)。


    5. 多路广播的实现细节

  • 事件绑定:通过 += 运算符,可以将多个函数绑定到一个委托对象上。
  • 事件解绑:通过 -= 运算符,可以取消函数对委托对象的绑定。
  • 调用顺序:系统会保证绑定后的函数按照绑定顺序执行。

  • 总结

    委托事件是面向对象编程的重要工具,使代码更加灵活和可维护。在实际开发中,应当根据项目需求合理使用多路广播,避免无谓的绑定操作。

    通过本文的分析,可以清楚地看到委托事件的与类声明的相似性,以及多路广播的实现原理。如果需要更深入的理解,可以进一步研究 Unity 中的事件系统!

    转载地址:http://gnudz.baihongyu.com/

    你可能感兴趣的文章
    SQL Server Performance Dashboard Reports
    查看>>
    .Net 跨平台可移植类库PCL可用于任何平台包括Mono
    查看>>
    多种坐标系之间的转换 Proj.NET和DotSpatial
    查看>>
    资深人士剖析微软开源.NET事件:战略重心已经从PC转移到云端
    查看>>
    JMeter 中实现发送Java请求
    查看>>
    排错-lr回放错误Vuser failed to initialize extensi...解决方法
    查看>>
    webpack 的 sourse-map 中 eval、cheap、inline 和 module 各是什么意思?
    查看>>
    设计模式点滴
    查看>>
    发布一款小软件:和讯博客助手-新闻采集测试版- 0.1.0
    查看>>
    Angular入门到精通系列教程(10)- 指令(Directive)
    查看>>
    数值压缩存储方法Varint
    查看>>
    Http压力测试工具HttpTest4Net
    查看>>
    机器学习实战 - 读书笔记(14) - 利用SVD简化数据
    查看>>
    CSS躬行记(2)——伪类和伪元素
    查看>>
    JavaScript作用域原理(一)——作用域链
    查看>>
    JavaScript中事件处理
    查看>>
    Hammer.js分析(四)——recognizer.js
    查看>>
    2019年8月19日~8月25日 第八周JAVA学习总结
    查看>>
    13.罗马数字转整数
    查看>>
    数据库优化
    查看>>