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—事件 的相关文章

  • c#获取cpu序列号

  • UE4 解决景深效果闪烁问题

    原因 1 模型的垂直竖线 造成抗锯齿算法对竖线的渲染计算 处于一种不稳定的状态 因此闪烁 解决办法 使用LOD 用贴图去替代线条模型 2 材质的法线贴图 当法线贴图含有垂直竖线的纹理效果 也会造成闪烁 比如这种幕墙材质 解决办法 关闭或动态
  • FBX导入Unity中模型没有材质的处理

    一 3dMax导出FBX时的注意事项 导出时 确保maps文件存在 里面放着fbx用到的image 二 在Unity中的设置 1 文件拖入Unity的Assets文件夹中 2 查看模型的材质是否存在 如下所示 材质为None 此时拖入sce
  • Unity Shader入门精要第七章 基础纹理之遮罩纹理

    Unity系列文章目录 文章目录 Unity系列文章目录 前言 一 实践 参考 前言 遮罩纹理 mask texture 是本章要介绍的最后一种纹理 它非常有用 在很多商业游戏中 都可以见到它的身影 那么什么是遮罩呢 简单来讲 遮罩允许我们
  • Unity中实现倒计时的几种方式

    1 Time time using UnityEngine public class TimeTest MonoBehaviour public float secound 10 void Update Timing private flo
  • 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 Unity死机未保存场景 当你在Unity中编辑场景 突然死机时 可以在项目文件目录中找到Temp文件夹 双击文件夹 找到 Backupscenes文件夹 把后缀为 backup的文件后缀改为 unity 然后拖进Unity的Proje
  • 【IMGUI】 各种辅助类 EditorGUIUtility、EditorUtility、GUIUtility、GUILayoutUtility

    EditorGUIUtility class in Editor 继承自 GUIUtility EditorGUI 的各种辅助程序 EditorGUIUtility currentViewWidth 我尝试打印了下这个值和position
  • Unity 键盘控制人物移动——之输入方式代码的编写

    键盘输入 控制人物移动 在我们制作游戏中最常见的需求之一就是使用键盘移动游戏角色 那么我们首先需要获取键盘输入 以下提供两种方法获取键盘 这里尽量通过截图解释让大家理解代码的含义 GetInput void FixedUpdate Move
  • Unity打开工程时卡住的问题

    自从Unity升级了一个版本后 Unity打开工程卡住的问题越来越严重了 具体表现为 选择工程后 Unity窗口消失 但进程还在 有时候等个几分钟能出来 有时候等10分钟都不见得能出来 直观感受上看 似乎是Unity加载工程的时候某一步卡了
  • unity3d大型互动照片墙

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

    本文章是基于如下视频的自我总结 https www youtube com watch v JivuXdrIHK0 步骤如下 1 在Canvas 界面添加一个Panel Panel中添加一个按钮 调整按钮的大小为合适大小 调整字体的大小为合
  • unity 性能查看工具Profiler

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

    最近想做一个跑酷游戏 从mixamo下载滑铲动作后 出了很多动画的问题 花了两周时间 终于是把所有的问题基本上都解决了 常见问题 1 动画序列 人物不移动 2 动画序列 人物移动朝向错误 3 蒙太奇 人物移动后会被拉回 4 蒙太奇 动画移动
  • Unity学习笔记

    一 旋转欧拉角 四元数 Vector3 rotate new Vector3 0 30 0 Quaternion quaternion Quaternion identity quaternion Quaternion Euler rota
  • U3D游戏开发中摇杆的制作(NGUI版)

    在PC端模拟摇杆 实现控制摇杆让玩家或者物体移动 以下是完整代码 using System Collections using System Collections Generic using UnityEngine public clas
  • 游戏开发常见操作梳理之NPC任务系统

    多数游戏存在任务系统 接下来介绍通过NPC触发任务的游戏制作代码 using System Collections using System Collections Generic using UnityEngine
  • 游戏开发之常见操作梳理——武器装备商店系统(NGUI版)

    游戏开发中经常出现武器商店 接下来为你们带来武器装备商店系统的具体解决办法 后续出UGUI Json版本 敬请期待 武器道具的具体逻辑 using System Collections using System Collections Ge

随机推荐

  • 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—事件

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