Unity---委托与事件

news2025/1/13 3:13:05

目录

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

 

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

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

相关文章

专家警告AI可能会导致人类灭绝

人工智能可能导致人类灭绝&#xff0c;包括 OpenAI 和 Google Deepmind 负责人在内的专家警告说 数十人支持在人工智能安全中心 的网页上发表的声明。 它写道&#xff1a;“减轻人工智能灭绝的风险应该与其他社会规模的风险&#xff08;如流行病和核战争&#xff09;一起成为全…

Spring(二)获取bean和依赖注入

一、获取bean的三种方式&#xff1a; 1.根据bean的id获取&#xff1a; Student studentOne (Student) ioc.getBean("studentOne"); 2.获取bean所需要的类型的class对象&#xff1a; Student student ioc.getBean(Student.class); 我们运行之后如下所示&#xff1…

为kong网关添加限流插件

限流用于控制发送到上游服务的请求速率。 它可用于防止 DoS 攻击、限制网络抓取和其他形式的过度使用。 如果没有速率限制&#xff0c;客户可以无限制地访问您的上游服务&#xff0c;这可能会对可用性产生负面影响。 一、全局范围内的限流 1、启用限流 [rootmin ~]# curl -i…

AI落地:儿童节贺卡

昨天有个朋友Lisa找到我&#xff0c;她是幼儿园的老师&#xff0c;看到我最近搞了个爱落地星球&#xff0c;在研究各行各业AI落地的事情&#xff0c;问我能不能用AI帮她写一百多张贺卡。 说起来写贺卡&#xff0c;我只会写“节日快乐”。现在有了ChatGPT&#xff0c;那就大不一…

十六、多线程(中)

文章目录 一、线程互斥&#xff08;一&#xff09;四个概念1.临界资源2.临界区3.互斥特性4.线程互斥5.原子性 二、互斥&#xff08;一&#xff09;在执行语句的任何地方&#xff0c;线程可能被切换走&#xff08;二&#xff09;切换会保存上下文&#xff08;三&#xff09;抢票…

用HTML、CSS和JavaScript实现鼠标可交互的3D太阳和月亮切换效果

部分数据来源&#xff1a;ChatGPT 引言 太阳和月亮对于我们来说是一种常见的对比&#xff0c;这篇文章将介绍一个使用HTML、CSS和JavaScript创建的网页场景&#xff0c;能够把太阳和月亮切换展示给用户。这个场景能够让用户使用鼠标和滚轮与场景互动&#xff0c;带来更多的趣…

解锁Qt QListWidget的全部潜力——用最佳实践和技巧赢得用户的喜爱和赞誉!

文章目录 前言一、属性和方法添加列表项获取当前选中的列表项删除列表项列表显示模式交替背景色 二、信号与槽选中的行数变化item被点击 三、解决icon图标模式下图标不对称的问题1、设置属性2、面向结果的手动换行 总结 前言 在现代的GUI应用程序中&#xff0c;列表框是必不可…

什么是千兆光模块和万兆光模块?它们有什么区别?

众所周知千兆光模块和万兆光模块的主区别在于它们的传输速率不一样&#xff0c;那你还知道千兆光模块和万兆光模块的其他区别吗&#xff1f;接下来海翎光电的小编将对千兆光模块和万兆光模块的区别进行详细解析。 什么是千兆光模块&#xff1f; 千兆光模块即传输速率为1000Mbps…

Java之路:构建坚实基础,系统学习Java技术的终极指南

无论是初学者还是有经验的专业人士&#xff0c;在学习一门新的IT技术时&#xff0c;都需要采取一种系统性的学习方法。作为一名Java技术er&#xff0c;下面我将介绍我是如何系统的学习Java技术的。 一、Java技术介绍 Java是一种广泛应用于软件开发的高级编程语言&#xff0c;…

数据链路层:点对点协议PPP

数据链路层&#xff1a;点对点协议PPP 笔记来源&#xff1a; 湖科大教书匠&#xff1a;点对点协议PPP 声明&#xff1a;该学习笔记来自湖科大教书匠&#xff0c;笔记仅做学习参考 数据链路层只负责直接相连的两个结点之间的通信 PPP是点对点数据链路层协议 用户通过ISP接入因特…

sklearn实现余弦相似度计算

from sklearn.metrics.pairwise import cosine_similarity cosine_similarity() 这个函数的输入是 n 个长度相同的 list 或 array 函数的处理是计算这 n 个 list 两两之间的余弦相似性 最后生成的是一个 n*n 的相似性矩阵s&#xff0c;s[i][j] 表示输入中第 i 个和第 j 个元…

如何在 Ubuntu Linux 上使用 SNAP 安装 Docker?

Docker 是一种开源的容器化平台&#xff0c;它允许开发人员将应用程序和其依赖项打包到一个可移植的容器中&#xff0c;以便在不同的环境中运行。在 Ubuntu Linux 上&#xff0c;我们可以使用 SNAP&#xff08;一种软件包管理系统&#xff09;来安装和管理 Docker。本文将详细介…

ProtoBuf 语法(一)

系列文章 ProtoBuf 语法&#xff08;二&#xff09; ProtoBuf 语法&#xff08;三&#xff09; 文章目录 前言一、字段规则二、消息类型的定义与使用2.1 定义2.2 使用 三、enum 类型3.1 定义规则3.2 注意事项 四、any 类型4.1 类型说明4.2 类型使用 五、oneof 类型六、map 类型…

HACKER KID: 1.0.1实战演练

文章目录 HACKER KID: 1.0.1实战演练一、前期准备1、相关信息 二、信息收集1、端口扫描2、访问网站3、扫描目录4、查看源码5、请求参数6、burpsuite批量请求7、编辑hosts文件8、DNS区域传输9、编辑hosts10、访问网站11、注册账号12、burpsuite抓包13、XML注入14、解密15、登录网…

供应链对于小程序、app等平台能带来什么好处?

供应链对于小程序、 app等平台的重要性不言而喻&#xff0c;这是一个企业生存的根本&#xff0c;只有保证了供应链&#xff0c;才能获得足够的产品和服务&#xff0c;保证企业能够长期稳定发展。因此很多企业都开始重视供应链&#xff0c;同时也在为之努力。 那么&#xff0c;…

gradle环境的spring boot搭建

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

tensorrt yolov7 推理

参考 源码修改如下&#xff1a;如果将源代码cpp/norm/yolo.hpp修改为自己训练的数据时修改如下&#xff1a; class YOLO{ const char* INPUT_BLOB_NAME "images"; const char* OUTPUT_BLOB_NAME "output"; }根据自己转换onnx模型采用netron打开查看 输入…

(2022,MoCA)Few-shot 图像生成的原型记忆(Prototype Memory)和注意力机制

Prototype Memory and Attention Mechanisms for Few Shot Image Generation 公众号&#xff1a;EDPJ 目录 0. 摘要 1. 简介 2. 相关工作 3. 方法 3.1 原型记忆学习 3.2 记忆概念注意力&#xff08;MEMORY CONCEPT ATTENTION&#xff0c;MoCA&#xff09; 3.3 空间上…

自平衡二叉树(AVL)及四种旋转方式详解

推荐可视化插入、删除节点的二叉树网站&#xff1a;AVL Tree Visualzation (usfca.edu) 1. 概述 AVL树是一种自平衡二叉搜索树&#xff0c;他是搜索二叉树(BST)的优化&#xff0c;它在每次插入或删除操作后&#xff0c;通过旋转节点来保持树的平衡性。AVL树的平衡条件是任意节…

代码随想录算法训练营第三十八天 | 力扣 509. 斐波那契数, 70. 爬楼梯, 746. 使用最小花费爬楼梯

509. 斐波那契数 题目 509. 斐波那契数 斐波那契数 &#xff08;通常用 F(n) 表示&#xff09;形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。也就是&#xff1a; F(0) 0&#xff0c;F(1) 1 F(n) F(n - 1) F(…