Unity基于C#事件委托机制

事件委托是一种用于实现观察者模式的设计模式,它允许对象在发生特定事件时通知其他对象。在Unity中,事件委托机制为开发者提供了一种简单而有效的方式来处理游戏中的事件和交互。

对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发的技术大佬,欢迎你来交流学习。

一、事件委托的基本概念

事件委托是一种特殊的类型,它可以持有一个或多个方法的引用。当某个事件发生时,事件委托会依次调用这些方法。在Unity中,事件委托通常通过定义一个委托类型来实现,然后使用该委托类型来声明事件和处理函数。

例如,我们可以定义一个委托类型来表示一个名为"ButtonClickEvent"的按钮点击事件:

public delegate void ButtonClickEvent();

然后,我们可以声明一个事件来表示一个名为"OnClick"的按钮点击事件,该事件的类型为上面定义的委托类型:

public event ButtonClickEvent OnClick;

现在我们可以在需要的地方触发该事件,例如在按钮被点击时:

if (OnClick != null) {     OnClick(); }

二、事件委托的使用场景

事件委托在Unity中广泛应用于各种场景,例如处理用户输入、处理游戏状态变化等。

  1. 处理用户输入

Copy
public delegate void MouseClickEvent(Vector3 position);

然后,我们可以声明一个事件来表示鼠标点击事件:

public event MouseClickEvent OnMouseClick;

在游戏中,当鼠标点击时,我们可以触发该事件并传递点击的位置:

if (OnMouseClick != null) {     OnMouseClick(Input.mousePosition); }

其他对象可以订阅该事件,并在鼠标点击时执行相应的处理函数。

  1. 处理游戏状态变化

游戏的状态通常会随着时间的推移而发生变化。使用事件委托,我们可以将游戏状态的变化与相应的处理函数绑定在一起,从而实现对游戏状态变化的响应。

例如,我们可以定义一个委托类型来表示游戏状态变化事件:

public delegate void GameStateChangeEvent(GameState newState);

然后,我们可以声明一个事件来表示游戏状态变化事件:

if (OnGameStateChange != null) {     OnGameStateChange(newGameState); }

其他对象可以订阅该事件,并在游戏状态变化时执行相应的处理函数。

三、事件委托的优势和注意事项

事件委托机制在Unity中具有许多优势和灵活性。

  1. 解耦合

使用事件委托可以将事件的触发和处理分离,从而实现对象之间的解耦合。触发事件的对象不需要知道哪些对象将处理该事件,处理事件的对象也不需要知道哪些对象将触发该事件。这样可以使代码更加模块化和可维护。

  1. 扩展性

使用事件委托可以方便地扩展和修改代码。当需要添加新的事件或处理函数时,只需要在相应的地方进行修改,而不需要修改其他相关的代码。

  1. 多播委托

事件委托支持多播委托,即一个事件可以有多个处理函数。这样可以实现多个对象同时对一个事件进行处理。

然而,使用事件委托也需要注意一些事项。

  1. 内存管理

事件委托可能导致内存泄漏问题。当一个对象订阅了事件,但忘记取消订阅时,该对象将无法被垃圾回收,从而导致内存泄漏。为了避免这种情况,我们应该在适当的时候取消订阅事件。

  1. 性能开销

事件委托的调用可能会带来一定的性能开销。当一个事件有多个处理函数时,调用事件将依次调用这些处理函数,从而增加了一定的开销。在性能敏感的场景中,我们应该合理地使用事件委托,并进行性能优化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/102938.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决方案 | 法大大电子签精准击破销售场景签约难题

新商业形态及新交易模式不断涌现,电子签已经成为现代商业活动中不可或缺的一部分。特别是在销售场景中,电子签的应用不仅可以提高销售效率,还可以降低成本,提高客户满意度。本文将详细分析电子签在销售场景中的应用价值能力&#…

快速解决“找不到msvcr120.dll无法执行代码”问题,总结5解决方法

计算机已经成为我们生活和工作中不可或缺的一部分。然而,在使用计算机的过程中,我们常常会遇到各种问题,其中之一就是找不到msvcr120.dll文件。这个问题可能会可能导致计算机程序软件,游戏无法正常运行,影响到我们的工…

(十四)VBA常用基础知识:当前excel文件所有sheet循环,获取sheet名,获取最大行数最大列数

获取当前excel的所有sheet以及sheet名 Sub test()Dim ws As WorksheetFor Each ws In Worksheetsws.ActivateDebug.Print ws.NameNext ws End Sub 输出结果: Sheet1 Sheet2 Sheet3 Sheet4 Sheet52.获取最大行数 首先要明白取最大行的方式,为什么这样取…

ceph 分布式存储与部署

目录 一、存储基础: 1.单机存储设备: 2. 单机存储的问题: 3. 商业存储解决方案: 4. 分布式存储: 5. 分布式存储的类型: 二、Ceph 简介: 三、Ceph 优势: 四、Ceph 架构&#xff1a…

01 时钟配置初始化,debug

1. 开启debug series,否则只能下载一次,再次下载要配置boot 2.f0外部时钟配置 h750 配置 实测可用

FPGA面试题(1)

一.FPGA内部结构 可编程I/OPLL锁相环(其作用为:分频,倍频,相位调节、占空比)逻辑阵列块LAB(每个LAB由16个逻辑器件LE组成,每个LE包括一个查找表LUT和一个RAM构成。Cyclone IV EP4CE6F17C8中包含…

【Spring AOP】统一异常处理

统一异常处理 统⼀异常处理使⽤的是 ControllerAdvice ExceptionHandler 来实现的, 类上面加上 ControllerAdvice 注解表示控制器通知类方法上面加上 ExceptionHandler 表示异常处理器,并添加异常返回的业务代码 两个结合表示当出现异常的时候执⾏某个…

Android终极大招之全面取代drawble文件实现View圆角背景样式的新方案

简介 最近一直忙于音视频SDK的开发,遇到很多问题,简单来说,就是怎么让别人接入SDK时越简单越好。相信大多数Android开发都会遇到一个场景,给TextView或Button添加背景颜色,修改圆角,描边等需求。一看到这样…

React 组件传 children 的各种方案

自定义组件的时候往往需要传 children,由于写法比较多样,我就总结了一下。 方案列表 1. 类组件1.1 类组件,不使用解构1.2 类组件,使用解构 2. 函数组件2.1 函数组件,不使用解构2.2 函数组件,外部解构2.3 函…

docker 登录本地仓库harbor问题

1、报错如下: 添加目标harbor 仓库的hosts vim /etc/hosts 2、报错如下: 添加修改/etc/docker/daemon.json文件中的 insecure-registries vim /etc/docker/daemon.json 然后 systemctl daemon-reload systemctl restart docker再次登录

HQChart实战教程66-动态调整HQChart布局大小

HQChart实战教程66-动态调整HQChart布局大小 需求小程序h5AppHQChart插件源码地址 需求 在不销毁hqchart实例的情况下,动态调整K线图或分时图的大小, 如下图,把图1的K线图大小调整为图2的大小 图1 图2 小程序 调整画布大小,并…

(c语言进阶)指针的进阶

一.字符指针 1.一般应用 (1)%c的应用 (2)%s的应用 字符指针没有权限通过解引用去改变指针指向的值 2.笔试题 题目:判断输出结果 int main() { const char* p1 "abcdef"; const char* p2 "…

前端开发工具vscode

一、下载安装 https://code.visualstudio.com/ 二、安装插件 三、使用 ①、创建一个空目录 ②、利用vscode工具打开该目录 ③、将该目录设置为工作区 在工作区中添加文件,还可以进行浏览器访问(提前安装了Live Server插件) 为工具…

Dubbo-SPI机制

1、Java的SPI机制 SPI的全称是Service Provider Interface,是JDK内置的动态加载实现扩展点的机制,通过SPI可以动态获取接口的实现类,属于一种设计理念。 系统设计的各个抽象,往往有很多不同的实现方案,在面向的对象的…

黄金票据与白银票据

文章目录 黄金票据与白银票据1. 背景2. 具体实现2.1 Kerberos协议认证流程 3. 黄金票据3.1 条件3.2 适用场景3.3 利用方式 4. 白银票据4.1 条件4.2 适用场景4.3 利用方式 5. 金票和银票的区别5.1 获取的权限不同5.2 认证流程不同5.3 加密方式不同 6. 经典面试题6.1 什么是黄金票…

018-第三代软件开发-整体介绍

第三代软件开发-整体介绍 文章目录 第三代软件开发-整体介绍项目介绍整体介绍Qt 属性系统QML 最新软件技术框架 关键字: Qt、 Qml、 属性、 Qml 软件架构 项目介绍 欢迎来到我们的 QML & C 项目!这个项目结合了 QML(Qt Meta-Object …

97 # session

koa 里的 cookie 用法 koa 里内置了设置 cookie 的方法 npm init -y npm i koa koa/router用法: const Koa require("koa"); const Router require("koa/router"); const crypto require("crypto");const app new Koa(); let …

3D 生成重建004-DreamFusion and SJC :TEXT-TO-3D USING 2D DIFFUSION

3D 生成重建004-DreamFusion and SJC :TEXT-TO-3D USING 2D DIFFUSION 文章目录 0 论文工作1 论文方法1.1论文方法1.2 CFG1.3影响1.4 SJC 2 效果 0 论文工作 对于生成任务,我们是需要有一个数据样本,让模型去学习数据分布 p ( x ) p(x) p(x…

易点云CFO向征:CFO不能只讲故事,价值创造才是核心

作者 | 曾响铃 文 | 响铃说 在今年6月初,也是易点云上市6天后,《巴伦周刊》正式启动评价“2023港美上市中国企业CFO精英100”的活动。 时间来到9月,评价揭秘,易点云CFO向征成功入选,被评为“年度最具成长潜力CFO”…

windows创建服务:更新服务信息乱码问题(ChangeServiceConfig)

因为小项目需要创建windows服务,安装微软官方示例一切都挺顺利,代码运行后发现配置的信息在系统里显示乱码。打开注册表发现的确是乱码。这就排除软件读取得问题,而是调用ChangeServiceConfig系统函数写入时就发生了乱码。让我在网上查找了一…