unity事件委托简介

uinty相关的委托的学习笔记,供日后复习使用

 

Delegate:

delegate(即“委托”),可以理解为一个函数的容器,能够在里面存放一些函数

委托首先会定义一个函数的模板

例如:public delegate void XXX(int a)、public delegate void XXX()

(上例一种是有传参的一种是无传参的)

注册:符合模板的函数都可以通过“+=”“-=”来进行注册

delegate(容器).Invoke()执行的时候,所有在注册在这个容器delegate内的函数都会被执行

不过委托delegate存在一个风险,即这个委托可以被直接被赋值

例:delegate_1=delegate_2,

加入在执行这一条语句的时候,delegate_1中已经注册了数个函数,而delegate_2中并没有函数

此时执行完该语句之后delegate_1中的函数就被清空了

为了规避这种情况的产生,我们就可以使用Event,写成event之后赋值的操作就不会发生了

Event:

event本质上也是delegate,只不过把delegate的权限变成了private

例如:public delegate void XXX()、public xxx delegate_1();

写成事件之后就变成了:public delegate void XXX()、public event xxx delegate_1()

相比于delegate,event具有更好的安全性

Action:

Action也是委托,其实就是unity封装后的delegate

相当于:public delegate XXX()

例如:public Action XXX()

除了写法更简单一些,和delegate没有什么很大的差别(Action最多支持16个参数的模板)

例如:public Action xxx()、public Action xxx()

当不只希望执行函数,还想要返回参数的时候,就可以使用Func了

Func:

Func和Action一样都是unity封装好的一种写法

相当于:public int/float/bool...... delegate XXX()

例如:public Func xxx() return int

区别于Action,在Action后面的括号中写返回值,那么注册在其中的函数都会返回值,那么这个返回值就会不停更新

而Func只会返回最后一个注册的函数的返回值

示例:
第三行通常可以放在Start()中,第四行则是按需调用

public event Action test_delegate();//这就是一个名为test_delegate的函数模板

public void do_something(){...}//这就是一个符合test_delegate模板的函数

test_delegate += do_something; //将do_something注册到test_delegate中

test_delegate?.invoke();//这样我们执行了这个test_delegate的函数容器,同时do_something也在这个时候执行了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值