Unity—事件

2023-11-15

每日一句:我见青山多妩媚,料青山见我应如是

目录

事件

委托和事件的关系?

为什么使用委托类型来声明事件?/为什么事件是基于委托的?

事件的定义

事件的核心功能

事件和事件模型

如何自定义事件


事件

委托和事件的关系?

事件是委托类型字段的包装器、限制器,限制外界对委托类型字段的访问,委托类型字段通过事件包装、限制后,外界只能去访问它的+=、-=操作符(添加/移除事件处理器)

为什么使用委托类型来声明事件?/为什么事件是基于委托的?

【事件拥有者角度】

为了表明事件拥有者能够对外部通知什么样的消息

【事件响应者角度】

一种[约束]事件处理器,能够收到什么样的消息

也约束了我们使用什么方法、签名来处理相应这个事件

并且会去使用委托类型的实例去储存方法的引用,去储存 事件处理器

事件响应者事件拥有者,提供了与之匹配的事件的事件处理器,能够记录、引用方法的这个任务,只有委托类型的实例才能做到

【Event事件是基于委托delegate】

  1. 类型兼容

事件响应者的事件处理器必须和这个约束匹配上,才能够订阅这个事件

  1. 通过委托去存储方法

记录、存储、保存方法的任务,委托类型实例才能办到

事件无论从表层约束上来说,还是底层实现上来讲,都依赖于委托类型

事件的定义

事件使一个类或者对象去通知其他类,对象们

事件是一个类型成员

事件可以“发生”,通知别人,发生后的效果,才是事件的功能

事件的核心功能

就是将事件的事件参数,也就是事件的相关信息,通知给那些订阅了这个事件的人们

“XX对象拥有了某个事件”或“X类它含有一个事件”——>这个类对象可以通过这个事件,来通知别的对象。如果这个事件发生了,关心、订阅这个事件的其他对象们会被依次的通知到,并且,它们会纷纷的做出响应,这些对象们就会协调统一的工作起来,程序,也会因为这个事件而发生变化

事件和事件模型

五个步骤:

  1. 我(类)要有一个事件(成员)
  2. 一群别的类关心,订阅我的事件
  3. 我的事件发生了
  4. 关心的类们被一次性通知到
  5. 被通知到的人,拿着事件参数作出响应

五个组成部分

事件的拥有者 事件的源头,一定是个类(或者对象)

事件  成员类型,核心功能:通知其他类,对象作出响应。事件不会主动发生,一定是由事件拥有者的内部逻辑触发

事件的响应者

事件处理器 处理事件的方法成员

事件订阅(+=操作符)

订阅关系+=

  1. 事件发生后,通知的一定是[订阅]了事件的对象们
  2. 事件处理器和事件的关系(本质就是事件处理器的返回值和参表是否和事件的委托类型一致)[C#规定:用于订阅事件的这个事件处理器,必须和事件遵循同一个约定,已经定义好的事件内部都有委托类型]
  3. 具体哪个事件处理器,处理那个事件

(因为一个事件响应者,可能有很多个满足约定的事件处理器)

例子:功能:每N秒进行一个固定的行为功能(打印信息)

//事件的拥有者:timer

//事件:E lapsed

//事件的响应者:Printer

//事件处理器:MyAction(自定义一个方法)

//事件的订阅关系:+=

public class EventEx:MonoBehaviour

{ Timer timer=new Timer();

  private void Start()

{ timer.Elapsed+=Printer.MyAction;}//添加事件处理器的简化写法

 【{timer.Elapsed+=new ElapsedEventHandle(委托类型)(Printer.MyAction)}//使用事件处理器,初始化一个新的委托实例】

{事件的拥有者.事件+=事件的响应者.事件处理器}

//Printer类的事件处理器:MyAction订阅了由timer为主体的[Elapsed事件]

public class Printer

{ internal static void MyAction(object sender,ElapsedEventAvags e)

{ Debug.Log(aaa);}

}

如何自定义事件

.Net规定,如果这个委托是为了声明某个事件而准备的,这个委托的命名方式

事件名+EventHandler

事件不能在外部直接调用,只有事件的拥有者通过某些内部逻辑才能触发

事件的拥有者【类】Customer类

事件【event关键字修饰】OnOrder事件

事件的响应者【类】Waiter事件

事件处理器【方法_受到约束的方法】TakeAction方法

事件的订阅关系【+=】

public delegate void OrderEventHandler(Customer _customer,OrderEventArgs _e)//为了声明OrOrder事件所使用

public class EventEx:MonoBehaviour

{ Customer customer =new Customer();

  Waiter waiter =new Waiter();

  private void Start()

{customer.OnOrder+=waiter.TakeAction;}

//事件拥有者的事件成员+=事件响应者的事件处理器(来订阅OnOrder事件)

//事件拥有者的内部逻辑触发的事件

customer.Order();

customer.PayTheBill();

}

public class Customer

{ public float Bill{get;set;}

public void PayTheBill()

{Debug.Log(I have to pay:+this.Bill);}

private  OrderEventHandler  orderEvenHandler;

//声明委托类型的字段,将会去存储,引用副委员的事件处理器

public evnet OrderEventHandler OnOrder//事件声明完整格式

{ add

   {orderEventHandler+=value;}

//委托事件+=事件处理器

remove

{orderEventHandler-=value;}

}

public event OrderEventHandler OnOrder;//事件声明简略格式

public void Order()//内部逻辑

{ if(orderEventHandler!=null)

{ orderEventArgs e=new OrderEventArgs();

 e.CoffeeName=Mocha;

 e.CoffeeSize=Tall;

 e.CoffeePrice=28;

 OrderEventHandler(this,e);

}

}

public class OrderEventArgs:EventArgs//存储点餐信息 传递事件参数

{   public string CoffeeName{get;set;}

public string CoffeeSize{get;set;}

public string CoffeePrice{get;set;}

}

}

}

public class Waiter

{ internal void TakeAction(Customer _customer,OrderEvnetArgs _e)

//根据顾客点餐信息传递事件参数计算不同金额

{ flaot finalPrice=0;

 switch(_e.CoffeeSize)

 { caseTall:

finalPrice=_e.CoffeePrice;

break;

caseGrand:

finalPrice=_e.CoffeePrice+3;

break;

caseVenti:

finalPrice=_e.CoffeePrice+6;

break

      }

_custome.Bill+=finalPrice;

}

}

属性是字段的包装器

事件是委托类型字段的包装器

字段能做到的属性都能做;属性能做的,字段不一定都能做

is操作符:检查对象是否与给定的类型兼容

as操作符:用于检查在兼容的引用类型之间执行某些类型的转换

//以上内容听B站宝藏Up主—BeaverJoe的课,做的学习笔记

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unity—事件 的相关文章

  • Unity 分块延迟渲染01 (TBDR)

    现代移动端图形体系结构的概述 现代SoC通常会同时集成CPU和GPU CPU被用于处理需要低内存延迟的序列 大量分支的数据集 其晶体管用于流控制和数据缓存 GPU为处理大型 未分支的数据集 如3D渲染 晶体管专用于寄存器和算术逻辑单元 而不
  • Unity中级客户端开发工程师的进阶之路

    上期UWA技能成长系统之 Unity高级客户端开发工程师的进阶之路 得到了很多Unity开发者的肯定 通过系统的学习 可以掌握游戏性能瓶颈定位的方法和常见的CPU GPU 内存相关的性能优化方法 UWA技能成长系统是UWA根据学员的职业发展
  • Unity-AR 简介

    Unity AR 简介 现有Unity AR Sdk ARKit 苹果推出的AR开发平台 ARCore Google 推出的增强现实 SDK ARFoundation ARFoundation是ARKit XR插件和ARCore XR插件
  • Unity动画控制器animator.CrossFade

    需要特别注意 1 CrossFade虽然可以不用任何逻辑来链接而直接跳转 但是CrossFade只能覆盖其他动画 当当前动画播放完毕而没有跳出这个动画时再次调用CrossFade将会失败 造成动画依旧停在原位 参数animator Cros
  • Unity动画系统详解

    目录 动画编辑器 编辑器面板 动画复用 前言 人形重定向动画 Humanoid 通用动画 Generic 旧版本动画 Legacy 动画控制器 系统状态 切换条件 状态机脚本 IK动画 反向动力学 BlendTree 混合树 Animato
  • Unity3d 插件 系列——DoTweenPro介绍(图文详细+案例)

    Unity3d 插件 系列 DoTweenPro介绍 图文详细 案例 前言 一 DoTweenPro简介 二 DoTweenPro安装 三 DoTweenPro主要组件 1 DoTweenAnimation 2 DoTweenPath 3
  • GooglePlay提审警告(com.google.android.gms:play-services-safetynet:17.0.0)

    1 Goole在今年6月份出的新政策 不在使用safetynet 而使用Play Integrity API 2 项目本身没有使用过safetynet 3 使用了firebase 查阅资料 解决方案如下 implementation pla
  • unity中创建询问弹出窗口

    在开发过程中进程会遇到需要弹出一个窗口询问用户是否进行的操作 今天就来制作一个这样弹出窗口 然后根据弹出窗口的选择内容不同进行不同的操作 本例中主要是为了删除一个数据 而在删除数据操作前需要得到用户的一个确认操作 这里面主要用到了Notif
  • Unity学习笔记(一)—— 基础知识

    一 基础知识 1 开发团队组成 2 unity特点 图形界面 所见即所得 入门简单 支持C 比OC C 更友好 js 国内外资源丰富 因为使用的人多 跨平台性好 PC端 移动端等 对VR AR的支持最完善 3 成功案例 游戏 炉石传说 神庙
  • unity3d大型互动照片墙

    1 本次应客户需求 制作一个大型照片墙互动 输出分辨率为9600 4320 注 unity3d官方推荐最大分辨率为8192 3686 4 经过现场长达24小时暴力测试中途未发生问题 姑且判定可以达到正常标准 废话不多说 先上效果 unity
  • Unity保存图片到相册

    Unity保存图片到Android相册 Java 纯文本查看 复制代码 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
  • unity 性能查看工具Profiler

    文章目录 前言 profiler工具介绍 菜单栏 帧视图 模块视图 模块详细信息 通过profiler分析优化游戏性能 最后 前言 每次进行游戏优化的时候都用这个工具查看内存泄漏啊 代码优化啊之类的东西 真的好用 但是之前也就是自己摸索一下
  • unity dots jobSystem 记录

    Looking for a way to get started writing safe multithreaded code Learn the principles behind our Job System and how it w
  • unity3d切换场景Application.LoadLevel(1)含义

    Application LoadLevel 1 场景ID
  • 【原神游戏开发日志1】缘起

    原神游戏开发日志1 缘起 版权声明 本文为 优梦创客 原创文章 您可以自由转载 但必须加入完整的版权声明 文章内容不得删减 修改 演绎 相关学习资源见文末 大家好 最近看到原神在TGA上频频获奖 作为一个14年经验的游戏开发行业的老兵 我就
  • unity小球跟随音乐节奏放大缩小和改变颜色

    放在小球身上 设置对应组件即可 using System Collections using System Collections Generic using Unity VisualScripting using UnityEngine
  • Unity中URP下的指数雾

    文章目录 前言 一 指数雾 雾效因子 1 FOG EXP 2 FOG EXP2 二 MixFog 1 ComputeFogIntensity 雾效强度计算 2 lerp fogColor fragColor fogIntensity 雾效颜
  • VS2022 | 显示Unreal Engine日志

    VS2022 显示Unreal Engine日志 视图 gt 其他窗口 gt Unreal Engine日志 视图 gt 其他窗口 gt Unreal Engine日志
  • U3D游戏开发中摇杆的制作(UGUI版)

    在PC端模拟摇杆 实现玩家通过控制摇杆让玩家移动 以下是完整代码 using System Collections using System Collections Generic using UnityEngine using Unity
  • 游戏开发常见操作梳理之小地图的制作

    游戏中一般存在小地图系统 实际上就是设置一个新的摄像机放置在玩家的正上方 然后在小地图上显示新摄像机看见的东西就可以了 在小地图上一般存在放大地图和缩小地图的按钮可以方便放大和缩小地图 这些操作是如何实现的呢 接下来直接上核心代码 usin

随机推荐

  • Unity3D关于ComputeShader

    由于最近在实验中需要大量循环计算产生网格 所以可能需要GPU的加速 对于compute shader学习下 可能对于做GPU加速有帮助 以下补充修改了转载文章的内容 原文链接 https blog csdn net csharpupdown
  • HTML怎么建立两行四列的li,关于CSS如何实现多行多列布局的方法

    这篇文章主要介绍了CSS实现多行多列的布局的实例代码 需要的朋友可以参考下 1 两列多行 HTML box1 实现两列多行布局 111 222 333 CSS box1 width 500px background EEEEEE box1
  • fortran求解雷诺方程_方程的计算机处理96(5)_C++vs

    计算机语言运用 数值计算9 方程的计算机处理96 5 C vs 计算机 电子线路组成的计算机器 人与计算机则是通过计算机语言 符号系统说给计算机听而交流 计算机语言有低级语言 机器语言 汇编 高级语言 C C C VB PASCAL LIS
  • 使用yarn搭建Vue,ElementUI,axios环境

    1 搭建vue ElementUI axios环境 1 1 安装yarn 安装yarn npm install g yarn 查看是否安装版本 yarn version yarn切换为国内源 yarn config set registry
  • OSI以及TCP参考模型

    一 网络发展历史 1 1946年第一代计算机网络是以单个计算机为中心的远程联机系统 2 1970年第二代计算机网络是以多个主机通过通信线路互联起来 3 1980年第三代计算机网络是以IOS 国际标准化组织 提出的OSI参考模型为中心的互联网
  • 图像匹配几种常见算法与实践

    奇技 指南 本文主要内容 1 模版匹配 2 特征匹配 3 深度学习去找目标 图像匹配的应用及背景 图像匹配是指通过一定的匹配算法在两幅或多幅图像之间识别同名点 应用 遥感 制图更新 计算机视觉应用程序 医疗用图像注册 图像匹配主要可分为以灰
  • 【STM32 x VScode】如何在vscode上编写stm32程序(固件库函数)

    本人使用keil5也算比较长时间了 但是keil5有个比较大的缺陷就是补全速度太慢 老是用的不太顺手 于是就想着使用万能的vscode来代替一下keil5的编写程序功能 注意 这里使用vscode并不是说可以把keil5给卸载了 它还是要借
  • 使用ADB指令永久隐藏或禁用状态栏和虚拟按键

    原理是强大的ADB命令 1 手机开启开发者模式 允许ADB调试 2 电脑上下载ADB包 adb rar 529 77 KB 下载次数 7681 3 解压到任意位置 比如c adb 4 cmd命令定位到adb目录 比如 cd c adb 5
  • 用于回归问题的异常鲁棒极限学习机(ORELM)(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 文献来源 极限学习机 ELM 作为机器学习中最有用的技术
  • 加密算法中的加盐值

    在应用中 出于到安全的考虑和数据的保密 需要使用到加密算法 有时候为了让加密的的结果更加扑朔迷离神鬼莫测一些 常常会给被加密的数据加点 盐 说白了 盐就是一串数字 完全是自己定义的 不多说 上实例 获取当前用户盐 param string
  • STM32外设系列—sg90(舵机)

    文章目录 一 sg90简介 二 引脚连接 三 控制方法 四 程序设计 4 1 配置定时器 4 2 编写控制程序 五 360 舵机 一 sg90简介 首先介绍说一下什么是舵机 舵机是一种位置 角度 伺服的驱动器 适用于一些需要角度不断变化的
  • listview动态标识被点击项并且不出现背景重绘紊乱的解决方法

    private int publicIndex 1 记录被点击item的id viewHolder layout setId position if position 1 0 publicIndex 1 第一次加载的时候默认选中第一项 如果
  • fpga卷积神经网络加速器,FPGA卷积神经网络综述

    如何使用FPGA加速机器学习算法 如何使用FPGA加速机器学习算法 当前 AI因为其CNN 卷积神经网络 算法出色的表现在图像识别领域占有举足轻重的地位 基本的CNN算法需要大量的计算和数据重用 非常适合使用FPGA来实现 上个月 Ralp
  • sql盲注

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 sql注入 盲注 前言 一 什么是盲注 二 步骤示例 1 测试注入点 2 测所在数据库长度 3 利用ASCII码猜当前数据库名 4 利用ASCII码查询表名 5 利用ASCI
  • Nginx的TCP运行时健康检查

    Nginx的TCP运行时健康检查 本章介绍如何配置TCP的运行状况检查 介绍 先决条件 被动TCP运行状况检查 服务器缓慢启动 活动TCP运行状况检查 微调TCP运行状况检查 匹配 配置块 介绍 NGINX和NGINX Plus可以持续测试
  • ORACLE如何停止一个JOB

    ORACLE如何停止一个JOB 1 相关表 视图 dba jobs all jobs user jobs 包含登录用户所有的JOB信息 dba jobs running 包含正在运行job相关信息 注意 须使用oracle的sys用户登录到
  • Matplotlib中plot和scatter以及subplot和add_axes区别

    之前在做练习时一直有两种方法 plot和scatter一直傻傻分不清 加上这次对matplotlib深入了解 可以清楚的去做判断 plot用法 from matplotlib import pyplot as plt plt plot 5
  • redis安装+主从+哨兵模式和坑。

    一 安装 版本 3 2 11 1 解压 2 进入解压后的目录 执行 make 3 执行 make install 这一步需要root权限的用户执行 注 不使用root用户安装时 在make install 后添加PREFIX usr loc
  • 跨境电商如何更好地备战销售旺季?

    跨境电商秋促来临 不知道各位卖家是否做好准备了呢 据外媒报道 TikTok Shop于近日开启了年度最大规模的黑五大促 而为了抢占旺季流量 继周二亚马逊宣布将于10月10日至11日举办第二届 Prime Big Deal Days 大促后
  • Unity—事件

    每日一句 我见青山多妩媚 料青山见我应如是 目录 事件 委托和事件的关系 为什么使用委托类型来声明事件 为什么事件是基于委托的 事件的定义 事件的核心功能 事件和事件模型 如何自定义事件 事件 委托和事件的关系 事件是委托类型字段的包装器