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委托,事件(抄录) 的相关文章

  • 一些个人常用的网站网址

    一些个人常用的网站网址 GitHub https github com Gitee https gitee com 1 书栈网 https www bookstack cn explore cid 27 tab popular 2 Unit
  • UnityLuaMvvM Lua 带通知的Mode类

    实现数据更新UI自动刷新的核心代码 欢迎关注https gitee com xiongks UnityMVVM mode function modeType local obj obj modeType modeType obj filds
  • unity game界面按下play会不断闪烁,按下暂停键(pause)或者中止/下一步(step),game界面的画面会接连变化

    没找到答案 改了两个下午的程序 改完还是这样 后来发现是FixedUpdate Update与OnDrawGizmos的问题 OnDrawGizmos是每帧都会绘制 用FixedUpdate理所当然就那啥了 分析的时候 就突然想到是不是这俩
  • 游戏开发unity编辑器扩展知识系列:修改纹理资源的TextureType

    需要用TextureImporter导入资源 调用如下代码 TextureImporter importer TextureImporter TextureImporter GetAtPath path importer textureTy
  • 【Unity Shader】屏幕后处理1.0:调整亮度/饱和度/对比度

    1 Unity中实现屏幕特效的基本步骤 什么叫屏幕后处理 Screen post processing effects 渲染完整个场景得到屏幕图像后对图像进行一系列操作 实现各种屏幕特效 这一步我们可以添加很多例如景深 Depth of F
  • Unity单元测试流程

    文章目录 环境 流程 1 创建一个存放 单元测试程序集 的目录 2 打开 Test Runner 窗口 3 选择单元测试模式 4 创建单元测试程序集 5 创建测试脚本 6 运行测试 环境 Unity 2020 3 3f1 流程 1 创建一个
  • 【UGUI】2D头顶血条制作

    前言 近期因为需要制作玩家和敌人头顶的2D血条 查找了很多博客 发现很多都拘束于Canvas的渲染模式必须要设定为ScreenSpace Overlay 还有应该是版本原因 我的是unity2019 1 11f1 用RecttTransfo
  • Unity WebGL错误集锦

    ips 0 Unity的PlayerSettings的otherSettings或者Publish Settings里面的Enable Exceptions里面选择Full StackTrace 可以在打出的包中的浏览器的webgl打印出错
  • unity制作一个可以自由滑动收缩的历史记录功能。

    公司在做一款模拟经营类的卖车游戏 需要一个简单的历史记录功能 放在左上角 记录最近20条的收入 支出记录 超过2秒不动则收起 收起时展示最近的一个消息记录 用到的组件是ScrollView 使用方法可以参考我写过的一篇博客 ScrollVi
  • Unity动画控制器animator.CrossFade

    需要特别注意 1 CrossFade虽然可以不用任何逻辑来链接而直接跳转 但是CrossFade只能覆盖其他动画 当当前动画播放完毕而没有跳出这个动画时再次调用CrossFade将会失败 造成动画依旧停在原位 参数animator Cros
  • Unity Shader入门精要第七章 基础纹理之遮罩纹理

    Unity系列文章目录 文章目录 Unity系列文章目录 前言 一 实践 参考 前言 遮罩纹理 mask texture 是本章要介绍的最后一种纹理 它非常有用 在很多商业游戏中 都可以见到它的身影 那么什么是遮罩呢 简单来讲 遮罩允许我们
  • unity中创建询问弹出窗口

    在开发过程中进程会遇到需要弹出一个窗口询问用户是否进行的操作 今天就来制作一个这样弹出窗口 然后根据弹出窗口的选择内容不同进行不同的操作 本例中主要是为了删除一个数据 而在删除数据操作前需要得到用户的一个确认操作 这里面主要用到了Notif
  • Unity打开工程时卡住的问题

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

    Unity保存图片到Android相册 Java 纯文本查看 复制代码 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
  • Unity旋转以及万向锁问题

    我之前研读了一些关于unity旋转相关的博客 一直想抽个时间写个总结 但是由于实习太忙一直没有写 趁着今天请了假晚上有时间把这段时间一些学习心得写出来 Unity inspector面板中的Rotation 在unity中 想必大家最先接触
  • unity3d image组件不显示

    需要将UI组件放到画布下面
  • 【转载】【Unity】WebSocket通信

    1 前言 Unity客户端常用的与服务器通信的方式有socket http webSocket 本文主要实现一个简单的WebSocket通信案例 包含客户端 服务器 实现了两端的通信以及客户端向服务器发送关闭连接请求的功能 实现上没有使用U
  • Unity学习笔记

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

    在PC端模拟摇杆 实现玩家通过控制摇杆让玩家移动 以下是完整代码 using System Collections using System Collections Generic using UnityEngine using Unity
  • 游戏开发创建操作之玩家信息系统的建立

    游戏一般都需要玩家信息系统 那么我们应该如何搭建玩家信息系统 接下来我将展示一种简单的方法 完整代码如下 using System Collections using System Collections Generic using Uni

随机推荐

  • 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 特别用于实现事件和回调方法 所