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也在这个时候执行了