Unity---委托与事件

2023-11-08

目录

1.委托和事件在使用上的区别是什么?

2. delegate委托

2.1示意图

2.2 DelegetTest.cs

2.3 Deleget_A.cs

2.4 Deleget_B.cs

2.5 运行unity. 点击按键 A

 2.6 点击按键 B

 3.Event 事件

3.1单个通知

3.1.1示意图

 3.1.2 Event_Test.cs

3.1.3 Event_A.cs

3.1.4 运行 点击按键A

 3.2多个通知

3.2.1示意图

 3.2.2 Event_Test.cs

3.2.3 Event_A.cs

3.2.4 Event_B.cs

3.2.5 运行 点击按键A


1.委托和事件在使用上的区别是什么?


委托和事件是C#中的重要概念,通俗来讲,委托是一个可以指向特定方法的指针,可以将委托分配给不同的脚本,使它们能够完成不同的任务。而事件则是一种使用委托实现的通知机制,它告诉委托需要执行任务了。因此,委托定义了任务,而事件则是通知委托执行任务的通知。在 Unity 中,通过使用委托和事件,可以实现诸如响应按钮点击,处理游戏碰撞等功能。

它们在使用上的不同:
定义:委托是一种类型,它可以引用方法。事件是一种基于委托的机制,允许在事件发生时通知多个对象。

用法:委托是一种低级机制,可以直接调用关联的方法。事件则是一种高级机制,它可以被订阅和取消订阅,并在事件发生时引发通知。

安全性:委托是一种不安全的机制,它允许直接访问关联的方法,这可能会导致错误。事件则是一种安全的机制,它只允许通过订阅和取消订阅来访问关联的方法,因此不存在安全风险。

总之,委托是C#中的一种低级机制,它可以直接调用关联的方法,但可能带来安全问题;事件则是一种高级机制,它是基于委托的,允许在事件发生时通知多个对象,并且更加安全。

2. delegate委托

2.1示意图

层级面板:

属性面板:

 

 

 

 如图,三个脚本分别挂载到三个物体上

2.2 DelegetTest.cs

using UnityEngine;

public delegate void Call(string type);

public class DelegetTest : MonoBehaviour
{
    public static Call call;

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.A))
        {
            call("a");
        }
        if (Input.GetKeyDown(KeyCode.B))
        {
            call("b");
        }
    }
}

2.3 Deleget_A.cs

using UnityEngine;

public class Deleget_A : MonoBehaviour
{
    private string type = "a";

    private void Awake()
    {
        DelegetTest.call += BeCalled;
    }

    private void BeCalled(string msg)
    {
        Debug.LogError(type + "接收到呼叫");

        if (msg.Equals(type))
        {
            Debug.LogError("a 开始做事");
        }
    }
}

2.4 Deleget_B.cs

using UnityEngine;

public class Deleget_B : MonoBehaviour
{
    private string type = "b";

    private void Awake()
    {
        DelegetTest.call += BeCalled;
    }

    private void BeCalled(string msg)
    {
        Debug.LogError(type + "接收到呼叫");
        if (msg.Equals(type))
        {
            Debug.LogError("b 开始做事");
        }
    }
}

2.5 运行unity. 点击按键 A

 2.6 点击按键 B

 3.Event 事件

3.1单个通知

3.1.1示意图

层级面板:

 

 属性面板:

 

 3.1.2 Event_Test.cs

public class Event_Test : MonoBehaviour
{
    public event EventHandler<Event_A> eventCall;

    [SerializeField]
    private Event_A eventA;

    private void Awake()
    {
        eventCall += Call;
    }

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.A))
        {
            eventCall.Invoke(this, eventA);
        }
    }

    private void Call(object obj, Event_A e_a)
    {
        Debug.LogError(e_a.args);
        e_a.DoSomething();
    }

}

3.1.3 Event_A.cs

using UnityEngine;

public class Event_A : MonoBehaviour
{
    public string args = "我是脚本A";

    public void DoSomething()
    {
        Debug.LogError("脚本A在做事");
    }
}

3.1.4 运行 点击按键A

 3.2多个通知

3.2.1示意图

层级面板:

 属性面板:

 

 

 3.2.2 Event_Test.cs

using System;
using UnityEngine;

public class Event_Test : MonoBehaviour
{
    public event EventHandler eventCall;

    [SerializeField]
    private Event_A eventA;
    [SerializeField]
    private Event_B eventB;

    private void Awake()
    {
        eventCall += eventA.Call;
        eventCall += eventB.Call;
    }

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.A))
        {
            eventCall.Invoke(this, EventArgs.Empty);
        }
    }
}

3.2.3 Event_A.cs

using System;
using UnityEngine;

public class Event_A : MonoBehaviour
{
    public string _name = "aaa";

    public void DoSomething()
    {
        Debug.LogError("脚本A开始做事");
    }

    public void Call(object obj, EventArgs args)
    {
        Debug.LogError(_name);
        DoSomething();
    }
}

3.2.4 Event_B.cs

using System;
using UnityEngine;

public class Event_B : MonoBehaviour
{
    public string _name = "bbb";

    public void DoSomething()
    {
        Debug.LogError("脚本B开始做事");
    }

    public void Call(object obj, EventArgs args)
    {
        Debug.LogError(_name);
        DoSomething();
    }
}

3.2.5 运行 点击按键A

 

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

Unity---委托与事件 的相关文章

  • UnityLuaMvvM Lua 带通知的Mode类

    实现数据更新UI自动刷新的核心代码 欢迎关注https gitee com xiongks UnityMVVM mode function modeType local obj obj modeType modeType obj filds
  • Unity3D之Rigidbody

    目录 常用的Rigidbody属性和方法 rigidbody AddForce rigidbody AddTorque rigidbody velocity rigidbody angularVelocity rigidbody Sleep
  • Unity 资源加载卸载过程

    什么时候才是UnusedAssets 看一个例子 Object obj Resources Load MyPrefab GameObject instance Instantiate obj as GameObject Destroy in
  • Unity中loading页加载的实现

    首先创建一个Global cs 使用单例用于存储场景的名字 便于后续脚本的调用 此脚本不必挂载在游戏物体上 using UnityEngine using System Collections public class Global Mon
  • unity网络资源导入

    1 找到需要导入的文件 这里导入fbx格式 2 打开unity界面 在Asset目录下创建文件夹FBX 将需要导入的fbx预制体或整个文件夹拖入创建的FBX文件夹下 3 选中需要的fbx预制体并拖至场景中 4 双击定位到当前物体 5 找到需
  • 1.17 从0开始学习Unity游戏开发--场景切换

    前面的所有文章我们都在一个固定的游戏场景内进行开发 在最开始介绍场景这个概念的时候就已经提及 这个场景可以是一张地图 或者是一个对战房间等等 所以显然这个场景可以有多个 并且可以从一个场景切换到另外一个场景 那么在Unity中如何进行场景切
  • c#获取cpu序列号

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

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

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

    Unity与Android的Back键冲突解决 上一篇的最后留下了两个问题 Unity视图下横屏闪退 Unity视图下Android无法响应back返回上一activity 对于第一个问题 应该是Unity横屏下视图的某些设置跟Androi
  • unity工程崩溃资源找回

    1 Unity死机未保存场景 当你在Unity中编辑场景 突然死机时 可以在项目文件目录中找到Temp文件夹 双击文件夹 找到 Backupscenes文件夹 把后缀为 backup的文件后缀改为 unity 然后拖进Unity的Proje
  • Unity打开工程时卡住的问题

    自从Unity升级了一个版本后 Unity打开工程卡住的问题越来越严重了 具体表现为 选择工程后 Unity窗口消失 但进程还在 有时候等个几分钟能出来 有时候等10分钟都不见得能出来 直观感受上看 似乎是Unity加载工程的时候某一步卡了
  • unity: C#的Action Event Delegate的异同

    目录 一 Action 二 Event 三 Action和Event区别 四 Delegate 总结 Action Event Delegate的异同 前言 Action Event和Delegate都是C 语言中的重要概念 分别用于管理函
  • VLC for unity 插件如何使用

    VLC for unity 插件如何使用 先去下载一个VLC播放器 安装完成后 然后导入插件链接https download csdn net my 这个插件我的另一个上传资源里有 或者到商店去下载 这个插件链接下载完是一个txt文档 里面
  • 【Unity】按Esc进入操作菜单

    本文章是基于如下视频的自我总结 https www youtube com watch v JivuXdrIHK0 步骤如下 1 在Canvas 界面添加一个Panel Panel中添加一个按钮 调整按钮的大小为合适大小 调整字体的大小为合
  • 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
  • Unity万向节死锁解决方案(2023/12/4)

    1 万向节死锁无法解决 这是因为它的特性就是如此 就像玻璃杯就是玻璃 这不可否认 别钻牛角尖昂 2 大多数情况下欧拉角足够用 例如 CF 摄像机不可能绕z轴旋转 x轴旋转也不会超过九十度 因为那样人物的腰子会被扭断 塔防游戏 保卫萝卜 吃鸡
  • unity3d 自定义的图片无法放入source image中

    须将图片的texture type改为 sprite
  • unity3d image组件不显示

    需要将UI组件放到画布下面

随机推荐

  • 一. 了解web及网络基础

    一 了解web及网络基础 web world wide web 万维网 是建立在互联网上的网络服务 分为网页和服务器 起初 互联网还只是少数人 为了能够远距离分享知识 前辈们提出一种设想 借助超文本 包含其他文档链接的文本 连成可相互参阅的
  • wangEditor 富文本在vue3的使用

    安装 yarn add wangeditor editor 或者npm install wangeditor editor save yarn add wangeditor editor for vue next 或者 npm instal
  • java大文件下载内存溢出解决办法

    第一种解决办法内存够用的情况 启动时设置 Xmx的值大一点 比如2G 第二种办法代码中使用缓冲流的方式 如果是本地文件就更好 如果是还需要再去文件服务器中下载一次也行 例子 private void download String down
  • 宜搭低代码开发师(高级)考试选择题错误整理集(自己整理的,考试前是50多分,看了后答题93分)

    目录 完成高级选择题认证目标 这是我考了无数次 整理的错题集 希望能够帮助到你 考
  • Win11编译cpu版本的pytorch源码

    1 下载源码和依赖库 首先 在github上下载指定版本的pytorch源码 地址如下 https github com pytorch pytorch 因为在pytorch源码中有一些依赖库是直接给出的超链接 因此都需要直接离线下载依赖库
  • 控制结构程序设计1

    某企业员工按小时计算工资 每月劳动时间 小时 每小时工资 总工资 总工资中扣除10 公积金 剩余的为应发工资 编写一个程序计算并输出某位员工的应发工资 具体要求 该员工的劳动时间和每小时工资数通过键盘输入 且在输入前要有提示信息 在输出结果
  • Node初次安装配置

    Node初次安装配置文档 一 下载Node js 安装Node js Node 官网地址 https nodejs org en 这里我们安装LTX版的 这个比较稳定 检查Node是否安装成功 win R cmd 按住键盘的win键和R键
  • day18Excise1

    1 阅读下面XML文档 然后判断下列说法正确的是 C
  • linux解压gz文件的命令

    解压tar gz文件的命令 LINUX解压缩TAR GZ文件命令 1 解压缩命令格式 tar zxvf 压缩文件名 tar gz 解压缩后的文件只能放在当前的目录 2 压缩命令格式 tar zcvf 压缩文件名 tar gz 被压缩文件名
  • 移动端页面禁止鼠标滑轮滚动的方法

    document body onmousewheel function event event event window event return false 火狐下使用 DOMMouseScroll document body addEv
  • 【数据结构】顺序表,链表

    前言 小亭子正在努力的学习编程 接下来将开启 javaEE 的学习 分享的文章都是学习的笔记和感悟 如有不妥之处希望大佬们批评指正 同时如果本文对你有帮助的话 烦请点赞关注支持一波 感激不尽 目录 前言 顺序表 ArrayList Arra
  • Elasticsearch

    Elasticsearch是一个分布式可扩展的实时搜索和分析引擎 它不仅包括了全文搜索功能 还可以进行以下工作 分布式实时文件存储 并将每一个字段都编入索引 使其可以被搜索 实时分析的分布式搜索引擎 可以扩展到上百台服务器 处理PB级别的结
  • 计算机无法找到扫描仪和照相机,Win7一体机无法安装扫描仪或者没有“扫描选项”的解决办法...

    现在的打印一体机都有打印 扫描 复印功能 而一些用户在win7中安装了打印机后发现扫描仪无法安装或安装后没有扫描选项 那么这样的情况该如何解决呢 现分享方法如下 1 既然扫描仪不能使用 有可能是扫描的服务 Windows Image Acq
  • Java教程:Mybatis一对多查询,并定义ResultMap

    Java教程 Mybatis一对多查询 并定义ResultMap 源码 PO 一方 ApiModel 事故管理 public class OcAccidentPO implements Serializable 事故ID ApiModelP
  • 1. MongoDB快速实战与基本原理

    分布式技术MongoDB 1 MongoDB介绍 1 1 什么是MongoDB 1 2 MongoDB vs 关系型数据库 1 3 MongoDB的技术优势 1 4 MongoDB的应用场景 2 MongoDB快速开始 2 1 linux安
  • 基于Python的在线自主评测系统设计与实现

    博主介绍 擅长Java 微信小程序 Python Android等 专注于Java技术领域和毕业项目实战 文末获取源码联系 精彩专栏推荐订阅 不然下次找不到哟 Java项目精品实战案例 300套 Java微信小程序项目实战 200套 Pyt
  • antd的TreeSelect获取父节点的值

    antd中有个treeSelect树选择组件 数据结构是一个树形结构 当我们点击时候会打开 然后可以选择不同的节点 选中的时候 当前的节点会被回填上输入框 但是现在有个需求是想选择子节点的时候 回填的时候 父节点跟子节点一起回填上 中间加个
  • Java全排列算法练习

    题目 素数就是不能再进行等分的数 比如 2 3 5 7 112 3 5 7 11 等 9 3 39 3 3 说明它可以3等分 因而不是素数 我们国家在 19491949 年建国 如果只给你 1 9 4 91 9 4 9 这 44 个数字卡片
  • 电脑文件&软件搬家迁移十大工具

    10 大适用于 Windows 的数据迁移软件 数据迁移至关重要 几乎所有组织都依赖于此 如果您认为数据传输不是一件容易的事 那么数据迁移软件可以帮上忙 1 奇客电脑迁移 将现有操作系统 软件 文件迁移到 新电脑的最佳方法之一是使用名为奇客
  • Unity---委托与事件

    目录 1 委托和事件在使用上的区别是什么 2 delegate委托 2 1示意图 2 2 DelegetTest cs 2 3 Deleget A cs 2 4 Deleget B cs 2 5 运行unity 点击按键 A 2 6 点击按