Unity委托,事件(抄录)

2023-10-30

 什么是委托?

C# 中的委托(Delegate)类似于 C 或 C++ 中函数的指针。委托(Delegate) 是存有对某个方法的引用的一种引用类型变量。引用可在运行时被改变。事件在任何位置声明

委托(Delegate)特别用于实现事件和回调方法。所有的委托(Delegate)都派生自 System.Delegate 类。

使用委托三步骤:(委托的声明、实例化,使用)

声明:委托声明决定了可由该委托引用的方法。委托可指向一个与其具有相同标签的方法。

语法结构:

delegate <return type> <delegate-name> <parameter list>

实例化:(所以printSting就是一个类型,像int一样,但是它存放的是方法(引用类型),int存放的是整数(值类型);ps1是类型为printSting的一个实例,像int a=1一样,但是ps1是引用类型所以需要new关键字咯...)

public delegate void printString(string s);
printString ps1 = new printString(WriteToScreen);

举例:

using System;
//声明委托
delegate int NumberChanger(int n);
namespace DelegateAppl
{
   class TestDelegate
   {
      static int num = 10;
      public static int AddNum(int p)
      {
         num += p;
         return num;
      }

      public static int MultNum(int q)
      {
         num *= q;
         return num;
      }
      public static int getNum()
      {
         return num;
      }

      static void Main(string[] args)
      {
         // 创建委托实例
         NumberChanger nc1 = new NumberChanger(AddNum);
         NumberChanger nc2 = new NumberChanger(MultNum);
         // 使用委托对象调用方法
         nc1(25);
         Console.WriteLine("Value of Num: {0}", getNum());
         nc2(5);
         Console.WriteLine("Value of Num: {0}", getNum());
         Console.ReadKey();
      }
   }
}

委托的多播(Multicasting of a Delegate)

委托对象可使用 "+" 运算符进行合并。一个合并委托调用它所合并的两个委托。只有相同类型的委托可被合并。"-" 运算符可用于从合并的委托中移除组件委托

using System;

delegate int NumberChanger(int n);
namespace DelegateAppl
{
   class TestDelegate
   {
      static int num = 10;
      public static int AddNum(int p)
      {
         num += p;
         return num;
      }

      public static int MultNum(int q)
      {
         num *= q;
         return num;
      }
      public static int getNum()
      {
         return num;
      }

      static void Main(string[] args)
      {
         // 创建委托实例
         NumberChanger nc;
         NumberChanger nc1 = new NumberChanger(AddNum);
         NumberChanger nc2 = new NumberChanger(MultNum);
         nc = nc1;
         nc += nc2;
         // 调用多播
         nc(5);
         Console.WriteLine("Value of Num: {0}", getNum());
         Console.ReadKey();
      }
   }
}

什么是事件?(不严谨的理解,事件就是委托类型的一个实例)

事件(Event) 基本上说是一个用户操作,如按键、点击、鼠标移动等等,或者是一些提示信息,如系统生成的通知。应用程序需要在事件发生时响应事件。例如,中断。C# 中使用事件机制实现线程间的通信。

通过事件使用委托

事件在类中声明且生成,且通过使用同一个类或其他类中的委托与事件处理程序关联。包含事件的类用于发布事件。这被称为 发布器(publisher) 类。其他接受该事件的类被称为 订阅器(subscriber) 类。事件使用 发布-订阅(publisher-subscriber) 模型。

发布器(publisher) 是一个包含事件和委托定义的对象。事件和委托之间的联系也定义在这个对象中。发布器(publisher)类的对象调用这个事件,并通知其他的对象。

订阅器(subscriber) 是一个接受事件并提供事件处理程序的对象。在发布器(publisher)类中的委托调用订阅器(subscriber)类中的方法(事件处理程序)。

声明事件(Event)

在类的内部声明事件,首先必须声明该事件的委托类型。例如:

public delegate void BoilerLogHandler(string status);

然后,声明事件本身,使用 event 关键字:

// 基于上面的委托定义事件
public event BoilerLogHandler BoilerEventLog;

上面的代码定义了一个名为 BoilerLogHandler 的委托和一个名为 BoilerEventLog 的事件,该事件在生成的时候会调用委托。

举例:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
//鸟类
public class TestB : MonoBehaviour
{
    public static event PetName SayHelloEvent;//事件
 
    void Start()
    {
        //在事件中添加方法
        SayHelloEvent = Parrot;
        SayHelloEvent += Pigeon;
 
        SayHelloEvent("小白");
    }
 
    //鹦鹉
    public static void Parrot(string name) 
    {
        Debug.Log($"我叫{name},是一只鹦鹉");
    }
 
    //鸽子
    public static void Pigeon(string name)
    {
        Debug.Log($"我叫{name},是一只鸽子");
    }
}

委托事件区分:

1.委托创建时会定义方法的类型。(是否有无参数、有无返回值)

2.事件的创建需要一个委托才能声明,(因为事件就是委托的实例)

3.委托可以在任何类中或类外声明,但是事件只能在类中声明,(类型跟实例,实例要运行所以要在类里面咯)

4.事件只能在当前声明的类中使用,无论将事件设置成public还是static其他类都无法调用(这个就是乌龟的腚d=====( ̄▽ ̄*)b了吧)

( 事件Event是一个添加了许多限制的委托。),这句是p话,也就是严谨的解释event

抄录于:菜鸟教程,和下面博文Unity中关于委托与事件的使用及区别_被代码折磨的狗子的博客-CSDN博客_unity事件和委托的区别

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

Unity委托,事件(抄录) 的相关文章

  • 35岁IT前辈,测试11年,第一次分享面试感悟

    最近几年我一直担任着软件测试面试官的角色 正好过年回来 也差不多金三银四求职季了 所以想写点面试的经验分享给大家 希望能对大家有些帮助 碍于才疏学浅 又是理工出身 字里行间未免词不达意 可能会让大家见笑了 软件测试面试环节 一般求职无非几个

随机推荐

  • java new数组_Java如何使用new创建数组

    java语言使用new操作符来创建数组 语法如下 arrayRefVar new dataType arraySize 上面的语法语句做了两件事 一 使用dataType arraySize 创建了一个数组 二 把新创建的数组的引用赋值给变
  • 零基础入门STM32编程(七)——定时器篇(HAL)

    前情回顾 上一篇讲解了HAL库函数点灯 初步学习了如何使用CUBE MX创建工程文件 以及文末送出了获取HAL库函数API手册方法的小福利 本篇将继续学习HAL库函数中的定时器API使用方法 一 初识定时器 上一篇讲解了使用HAL库函数点灯
  • 浮点数为什么不精确?

    浮点数为什么不精确 其实这句话本身就不精确 相对精确一点的说法是 我们码农在程序里写的10进制小数 计算机内部无法用二进制的小数来精确的表达 什么是二进制的小数 就是形如 101 11 数字 注意 这是二进制的 数字只能是0和1 101 1
  • Excel技巧-动态引用其他Sheet中的内容

    本文讲述了如何根据单元格内容为参数动态引用Excel其他单元格中的内容 这些单元格可能是同一个sheet 也可以是不同的sheet 主要使用了两个函数 Address 用来动态生成单元格地址 Syntax ADDRESS row num c
  • matlab绘制正弦波频谱图,matlab对正弦信号作FFT得到频谱图

    转自 https www cnblogs com alexanderkun p 4723577 html https blog csdn net qq 36024066 article details 89491650 一 FFT物理意义如
  • vue2-vant组件库-van-search获取焦点方法

    vue2 vant组件库 van search获取焦点方法 场景 1 进入搜索页时 搜索输入框自动获取焦点 2 点击历史记录 搜索输入框自动获取焦点 思路 1 通过在van search组件标签通过ref获取输入框的dom元素 2 在进入页
  • python 关于Max retries exceeded with url 的错误

    在爬取boss直聘时出现这种错误 于是搜索了网上很多文章 总结如下 1 http连接太多没有关闭导致的 解决方法 import requests requests adapters DEFAULT RETRIES 5 增加重连次数 s re
  • 基于Arduino实现简单人体红外感应灯(人体红外传感器+LED)

    这是一个使用arduino以及人体红外传感器实现的人体感应灯 详细细节如下 1 实验元件 UNO 实验套装 arduino控制板 USB数据线 面包板 跳线 人体红外传感器1个 led灯1个 电阻 220欧 1个 2 实现连接图 如图 这是
  • 后缀–ize_动词后加ize的后缀有什么作用

    展开全部 动词后加ize的后缀的作用是将原有的动词意思变为使动状态 即使成 状态 使e69da5e6ba903231313335323631343130323136353331333431376632 化 后缀 ize ise含义 来源和词
  • C语言基础入门48篇_21_定义和使用自己的函数(函数结构:输入参数-->实现功能-->返回值,类似数学中函数、参数可以多种、返回值一种类型、函数声明与实现、#include语句本质是复制粘贴)

    定义和使用自己的函数 函数结构可以总结为 输入参数 gt 实现功能 gt 返回值 1 函数的实现的基本语法 返回值类型 函数名称 形参列表 函数体语句 如我们之前所定义的判断数字奇偶的函数 int IsEvenNumber int nNum
  • pandas之删除缺失值dropna()

    import numpy as np import pandas as pd s pd Series 12 33 45 23 np nan np nan 66 54 np nan 99 df pd DataFrame value1 12 3
  • Java必知必会的常用类库

    阅读文本大概需要3分钟 Java是一个开源的世界 如果你不懂的在网上寻找适合的轮子 而是经常避免造成 你将无法再代码的泥潭里解脱出来 但是这也不是一概而论的 初学者需要造轮子的能力 而熟练开发者需要改轮子的能力 精通者需要发现轮子的能力 今
  • 大数据与人工智能的关系,不少于500字

    大数据与人工智能是密切相关的两个领域 大数据指的是海量 高增长率和多样化的数据 它可以来自各种不同的来源 如社交媒体 传感器 互联网 电子商务等 而人工智能则是计算机科学的一个分支 研究如何让计算机模拟或增强人类的智能 大数据和人工智能的关
  • 印刷业MES系统解决方案

    印刷业症结所在 1 不能实时准确的跟踪每一批订单的的生产进度 包括各工序的进度 2 印刷报价混乱 没有一个标准的报价参考 很难确保报价的准确性 3 不能有效控制产品加工的成本 没有电脑辅助计算 或者软件不具有计算工单成本的情况下 在开工单时
  • idea快速实现接口

    1 创建接口 public class TestI int getA 2 实现类 alt enter
  • 新词发现方法,新词发现算法有哪些,热词的发现方法,互联网热词挖掘方法

    1 新词发现方法 1 从大数据中抽取 通过抓取互联网上的海量语料 利用统计模型和自然语言处理技术 挖掘新的高频单词或词组 比如Google的Ngram Viewer 2 基于社交媒体的新词发现 通过分析社交媒体平台上的大量用户互动记录 挖掘
  • UMG主菜单切换到场景中的问题解决

    链接来自UE4官方文档 https docs unrealengine com zh CN Engine UMG HowTo CreateMainMenu index html 只说问题 1 OptionMenu必须成为一个变量 否则没法在
  • ciscn login

    这是去年国赛一道签到题 当时没做出来 现在来复现一下 一 查看保护 保护全开 二 逆向分析 main void fastcall noreturn main int64 a1 char a2 char a3 char s 1032 rsp
  • 报错:Keil5执行文件之后显示Target not created

    报错 Keil5执行文件之后显示Target not created 分析 Keil中出现Target not created 原因主要有 1 编译时出错 比如语法错误 变量未定义 2 连接时出错 比如调用外部函数 而由缺少相应的OBJ文件
  • Unity委托,事件(抄录)

    什么是委托 C 中的委托 Delegate 类似于 C 或 C 中函数的指针 委托 Delegate 是存有对某个方法的引用的一种引用类型变量 引用可在运行时被改变 事件在任何位置声明 委托 Delegate 特别用于实现事件和回调方法 所