| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 游戏开发 -> C# 事件(结合 unity) -> 正文阅读 |
|
[游戏开发]C# 事件(结合 unity) |
前置知识: C#委托 学习事件之前,最好先对委托有个大致的认识,因为事件是基于委托的,这说明事件和委托有些共同点,事件又有它额外的一些特点。关于事件和委托的联系也会在本篇博客进行介绍。 掌握了委托和事件后,相当于跨过了 C# 语言学习的一个坎,合理地使用委托和事件,能够大大地提高开发效率。 本篇参考了B 站 up 主 BeaverJoe 对 C# 事件视频讲解,我也向大家强烈推荐这位 up 主,每一个视频质量都是挺不错的。 还有刘铁猛老师的经典 C# 教程: 事件概念简要地来说,C# 的事件带有通知机制。也就是一件事发生后会去通知其他事物。
举个例子: 这句话有2个主要的对象:博主和粉丝,他们的关系是粉丝关注(订阅)了博主 那么现在其实就可以总结出事件比较完整的概念。这里用程序的话语来概括:
这里需要注意的是事件是类的成员。可以理解为事件会隶属于一个主体,比如发博客这件事隶属于博主,只有博主才拥有“发博客”这个事件。 C# 可以作为面向对象编程语言,面向对象编程本身就是对现实世界的模拟,将现实世界具体的东西抽象成类,比如博主就可以抽象成博主类,因为博主能发博文,用代码表示就是博主类有个“发博客”的事件。事件作为成员起到通知别的类和成员的作用。博主发博客的事件触发后就会通知到关注他的粉丝。 由此我们引出“事件模型”的概念,帮助大家更好地理解事件。 事件模型五个步骤
五个组成部分
基本和之前描述的事件概念可对应,大家可以注意到在“五个步骤“中有一个事件参数的概念,这个其实也很好理解,有时候事件发生时需要传给订阅者一些信息,从程序的角度来说就是传递参数。 举一个游戏中的例子: 总结来说:事件订阅者会为事件配备上事件触发后的响应方法,这个响应方法也叫事件处理器,然后当事件发生时事件的拥有者将事件参数(事件相关信息)通知给事件的订阅者,订阅者随之作出响应。 订阅详解作为事件模型的组成部分之一,订阅关系是很重要的。它规定了以下几点: 事件是基于委托的事件是基于委托的原因有2点: 事件的声明和使用(完整格式)事件的声明有完整格式和简略格式。平时我们基本用的都是简略的格式,不过这里也介绍一下完整格式,为了帮助大家更好地理解委托与事件的关系。
这个委托可以匹配无参,有1个 float 类型参数的方法,将金额作为参数传递。
可以看到,事件的声明有点像属性的声明。只不过属性的声明是为一个字段提供 get 和 set 构造器,而事件的声明是为委托字段提供 add 和 remove 构造器,相当于提供添加和移除方法的功能。也就是说,事件相当于委托的包装器。这个待会儿解释。
在 Start 方法中进行事件注册,然后触发事件。 事件相较于委托的独特之处之前说了,事件是委托字段的包装器。包装器为委托提供了保护和限制作用。我们拿到了一个委托字段后,可以在任何地方去绑定与之类型兼容的方法,也可以在任何地方调用。可是将委托封装进事件之后,事件就只对外提供添加和移除的操作。也就是其他类只能通过 “+=” 和 "-="来为包装的委托添加和移除方法,但是不再有权利去调用这个委托了。像刚刚代码中的 Start 方法中:
OnOrder 是 Customer 类的一个事件,这个事件包装着私有的 onOrderEventHandler 委托字段。那么我可以在另一个类 PurchaseSimulator中通过 “+=” 为 Customer 的 OnOrder 事件添加事件处理器,相当于把方法添加给包装的委托字段。但是我无法这么做:
会报这个错: 因此我无法在别的类去调用 Customer 类的事件。可如果是单纯的委托字段是可以实现在别的类去调用当前类的委托。比如我把刚刚的委托字段改为 public ,那么这种写法是不报错的:
这就说明事件为委托字段提供了保护功能,使得在类的外部不能主动触发当前类的事件,而是只能为包装的委托添加或者移除事件处理器。 而且使用多播委托时还有一个缺点,就是我为委托添加方法时如果一不小心将“+=” 写成了 “=”,会将这个委托之前所封装的所有方法全覆盖掉,可是事件不允许用 “=”把方法传给事件,它只提供了 “+=” 和 “-=” 事件的声明和使用(简略格式)其实事件的声明有种简略的声明格式,不过绝大多数人就是使用简略格式,完整格式反而鲜为人知。
这一步可以直接浓缩成一行:
因为现在没有手动声明委托类型的字段了,所以对 Customer 类的代码做些小修改:
这样声明,会让人有种“事件就是一种特殊的委托类型的字段,只不过加了个 event 关键字”的错觉。像我之前就是直接学习事件的简略声明格式,导致也会产生这种认知。 然后还有一点,大家还记得这张截图吗: 在 BeaverJoe 和 刘铁锰老师的视频中,用了 EventHandler 作为事件包装的委托,还有 EventHandler 所相关联的参数类 EventArgs。这两个是 C# 已经为我们提供好的了,可以涵盖所有类型的方法,具体的用法我放到了《 unity 事件管理中心》这一章去说明。链接:unity 事件管理中心 委托与事件系列四部曲: |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/27 18:42:33- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |