unity学习

  • 委托
    • 含义
    • 定义
    • 使用
  • 事件
    • 含义
    • 使用

在进行项目的过程中,一直存在着对代码管理不当的问题,所以需要学习一些科学的代码思维,减少后期功能的修改与迭代引发的代码冗杂和内存爆炸
可以看b站这个大神的视频,讲的可以说无敌详细了,详细到萌新第一次接触会被劝退的地步(可能只是对我)

委托

含义

根据我观看视频和实际手操后,感觉和java里的接口有点类似,就是这个委托他啥也不干,就是一个指明方向的东东,也有点像指针(没接触过,但是有了解过),感觉就是通过他去找到另一个东东,然后调用他的方法。这么做的好处就是减少代码量,也可以提高代码的可读性和复用性。像java的接口就是只定义方法名,然后剩下的就是去实现这个接口,并且重写他。大概意思好像就是这样,看上面这个大佬的视频他在讲解的时候翻看官方文档,里面说明的时候就说委托他是一个引用类型的数据类型,也相当于Java里自定义一个对象,然后在对象里设置属性,通过新建这个对象设置他的属性,也通过这个对象获得他储存的属性数据。我们自定义的对象就是一个引用类型的数据类型,他在运行的时候只是充当一个地址和路标的作用,实际上不储存任何数据,我们是通过他记录的地址信息,去找到真实的数据,这可能要涉及到堆栈,一个负责存放真实的数据,一个负责存放引用数据的地址。这是我看后的感觉,如果有不对的地方,欢迎大佬们指正!

定义

如何在代码中声明一个委托,只要像创建方法一个就行,在前面加多一个delegate即可

public delegate void TestDelegate();

这是自定义的委托,c#里有自带的Action 和 Func委托类
第一个是可以传入参数,但不给返回值的委托
第二个是有返回值,也可以传入参数的委托
查看他们的类,你也能看到他们其实也是自己在创建的时候添加了delegate这个属性来定义他是一个委托的

使用

当存在传入参数类型和数量一致,并且返回值类型也保持一致的多个方法的时候,可以统一用委托进行调用,提高代码的可用性,并且如果在这多个方法中如果大致相同,只是部分参数的不同,那个参数也可以使用委托代替。
这里只做学习记录,不做过多的代码演示(就是还没学透)

事件

含义

基于委托,通过委托链接事件的拥有者和响应者,分别调用他们各自的办法
相较委托更安全,因为使用事件只能对事件进行添加减少,不能获得其他的方法,防止了数据污染和非法调用,而且通过委托可以对事件响应者要调用的方法进行约束,减少bug出现的频率
一个完整的事件应该包括
事件拥有者,事件,事件响应者,事件处理器以及事件订阅
拥有者就是发送消息的对象,需要在这个对象里写好需要发送的内容并且调用事件,事件就是拥有者需要做的事情,事件响应者就是收到要进行事件的对象,而事件处理器就是响应者收到消息后要做的事情,事件订阅就是将事件拥有者和事件响应者之间进行连接

使用

using UnityEngine;
//先定义一个委托
public delegate void CatCallEventHandle();//这个就是事件订阅需要的条件之一
public class Test : MonoBehaviour
{//定义一个猫类class Cat{//定义一个事件,绑定委托public event CatCallEventHandle CatCall;//定义猫叫类public void OnCall(){Debug.Log("CatCall");//启动事件,也即是发送消息CatCall();}}//定义一个人类class People{//事件响应者//定义人醒了的方法public void PeopleAwake(){//事件处理器Debug.Log("人醒了");}}//定义鼠类class Mouse{//事件响应者public void MouseCall(){//事件处理器Debug.Log("鼠叫");}}//创建启动方法void Start(){Cat cat = new Cat();People people = new People();Mouse mouse = new Mouse();//给事件添加需要发送消息的对象cat.CatCall += new CatCallEventHandle(people.PeopleAwake);//将需要调用的方法传给委托cat.CatCall += new CatCallEventHandle(mouse.MouseCall);//事件订阅中//启动猫叫的方法cat.OnCall();}
}

运行

大致的流程就是先创建委托,这个委托的入参和返回都需要提前设计好,后面在发送消息的时候如果事件响应者和委托的入参或者返回值不同都无法正常运行
总结,可能运用时候不会很难,但是原理要搞懂还是需要花时间
后面需要使用事件和委托去实现任务系统。加油吧~

2022.08.18更新

上面的代码可以简写成

cat.CatCall += people.PeopleAwake;
cat.CatCall += mouse.MouseCall;

之前那样写是因为视频这么写, 也没有说可以简写,可能是为了更方便我们理解(但其实我反而更不好理解了 …)

总而言之,最近又重温了一遍这四个关键词,下面是我的个人感受
推荐一个视频,这个视频讲的真的很容易理解

https://www.bilibili.com/video/BV1LT411L7yv?spm_id_from=333.788.top_right_bar_window_history.content.click&vd_source=a9f1c2747f921195810879a90b078430

delegate用法: delegate void 委托名(形参); -----委托可以看做是类
委托名 方法名

event用法; 可以看成和void一样的存在------限制不让委托的方法被外部类清空(重点是不让外界=,也不允许在外部类执行,但是可以+=和-=,+=和-=的范围没有限制,其实个人感觉这样好像还是可以污染委托…)

Actino用法:Action<参数类型> 名称;

Func用法:Func<参数类型,返回值> 名称; ----<>里最后一个参数作为返回值

以上的委托事件等用法都必须保证里面不为空,再去执行,否则会报错!

unity学习-委托(delegate),事件(event),Action,Func相关推荐

  1. C# 委托(Delegate) 事件(Event)应用详解

    委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每 ...

  2. Unity3d:委托、事件、Action

    作者:KillerAery 出处:http://www.cnblogs.com/KillerAery/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原 ...

  3. Unity学习之常用事件函数Update深度解析

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.常规更新函数 Update() FixedUpdate() LateUpdate() 总结 前言 Unity与常规 ...

  4. C#委托(delegate、Action、Func、predicate)和事件

    C#委托(delegate.Action.Func.predicate)和事件 - 园子的蜗牛 - 博客园 C#之委托 - 摸鱼王 - 博客园 C++函数指针与C#委托之间有何联系 - 51CTO.C ...

  5. C#学习(一):委托和事件

    预备知识 在学习委托和事件之前,我们需要知道的是,很多程序都有一个共同的需求,即当一个特定的程序事件发生时,程序的其他部分可以得到该事件已经发生的通知. 而发布者/订阅者模式可以满足这种需求.简单来说 ...

  6. C#基础加强(8)之委托和事件

    委托 简介 委托是一种可以声明出指向方法的变量的数据类型. 声明委托的方式 格式: delegate <返回值类型> 委托类型名(参数) ,例如: delegate void MyDel( ...

  7. C# 委托 (delegate)

    委托是类 委托是类,C# 提供了 delegate 关键字,使得用户能简单的声明委托.编译器及 CLR 做了大量的工作来隐藏委托的复杂性.[1] internal delegate void Feed ...

  8. Delegate,Action,Func,匿名方法,匿名委托,事件

    一.委托Delegate 一般的方法(Method)中,我们的参数总是string,int,DateTime...这些基本的数据类型(或者没有参数),比如 [c-sharp] view plainco ...

  9. 七天学习计划_c#_[2][3][4][5]委托、事件、委托与事件的区别、泛型委托、Func\Action\predicate

    由于委托之前的博客已经详细写了,这里就简单的过一遍,复习一下: 了解委托 基于委托开发事件驱动程序变得非常简单. 使用委托可以大大简化多线程编程难度. 理解委托 委托也可以看做成一种数据类型,可以定义 ...

最新文章

  1. 关于Messenger实现进程间通信
  2. MySQL的Grant命令
  3. Android 如何调用系统默认浏览器访问
  4. 安装mlxtend_python机器学习包mlxtend的安装和配置详解
  5. cocos2dx 3.x Value、Vector和Map意识
  6. 标准exception类层次图
  7. php为什么查询语句加上order by就显示不出来,sql会查出结果 php页面偶尔显示空白 没有从sql得到结果...
  8. 【李宏毅2020 ML/DL】P110-111 Policy Gradient Proximal Policy Optimization
  9. 素数筛法求素数(线性时间)
  10. 高等数学(第七版)同济大学 习题7-3 个人解答
  11. QPushButton 实现保持按下效果
  12. Unity3D 学习笔记3——了解U3D引擎的操作面板和各种工具
  13. 关于ROM版本的解释,ROM版本ROM测试到底是什么
  14. 计算机二级office学习之PPT操作题考点整理
  15. 解决Ubuntu:e1000e无法驱动无法上网问题
  16. DSP TMS320F280049之模拟比较器CMPSS(寄存器版)
  17. matlab中图像分割技术之二阈值分割
  18. 计算机绘图自考知识点,计算机绘图(电子AD)自考大纲-08年9月.doc
  19. WebRTC手记之本地视频采集
  20. 分块查找 转载自https://www.cnblogs.com/Ming8006/p/8330481.html

热门文章

  1. cadence SPB17.4 capture and cis 全部错误消息列表
  2. H5游戏中心 免费版v1.2源码 网站全套源码
  3. 工作-iview的Tooltip+render函数
  4. 教育部公布研考违规违法行为举报电话
  5. 如何做好机器人方向的毕业设计?(毕业论文基本流程+机器人课程学习计划)
  6. 必学比知性能指标和常用术语
  7. 软件测试---测试技术(2)
  8. MEM/MBA数学强化(06)数列
  9. Java Exer0907 工作量计算器
  10. 都 2021 年了,你还在用 Kafka?快试试这个全新平台吧