原文链接
作者:游戏程序猿
链接:www.jianshu.com/p/fc7fdb3e6…
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
正文
学 Unity 的同学委托事件傻傻分不清楚,今天我就给大家来讲讲什么是 Unity 的委托的几个要点:
1: 定义一个委托的类型。
委托是一种 容器,容器里面放的是 函数方法。而函数的形式各不相同,参数、返回值各不相同,所以你做委托之前,先得要定义好这个委托容器存放的函数的类型, 即 委托类型。
delegate void Delegate_func(参数1, 参数2)
这句是定义了一个 Delegate_func 的 委托类型,里面存放的函数的类型为:
void Delegate_func (参数1, 参数2)
2: 定义一个委托容器变量,来存放函数
当我们定义好委托类型后,也就定义了 这个容器存放什么样的函数,接下来我们定义一个委托变量, 这个就比较简单了,
Delegate_func clicks
如何往容器里面加入函数呢?
- 一个是赋值
= - 一个
+= - 一个是
-=
clicks = xxxx函数;
clicks += xxxx函数;
clicks -= xxxx函数;
3: 触发委托:
定义了好了函数类型,再将函数加入到委托容器后,你只要触发委托调用,委托就会帮你 把容器里面的每个函数都调用一次, 触发的时候和调用普通函数没有区别,例如
clicks(参数1, 参数2);
4: 委托有什么用呢?
我们经常希望某个事件发生了以后,就做某种处理, 比如,收到网络事件后做响应的处理。这个时候,我们可以定义一个委托变量,将有事件发生后要处理的函数对象都保存进去, 当有事件发生的时候,触发这个委托,这样,之前的那些函数都会被调用到。有事件了,做哪些处理。
5: event 又是什么鬼?
会有这种情况,一个 模块A 定义了一个委托变量, 外部 模块B,要给这个委托变量添加回调函数, 这样,我们一般会把这个变量设置成 public,直接可以访问,可是问题来了,触发的时候,A模块 可以触发,B模块 也可以触发,可是我如果只想要 A模块 触发,B模块 只能添加,不能触发,而 public 权限 B模块 也可以触发。
这种如何解决呢? 这个时候定义委托变量的时候,在前面加 event, 这样外部 模块B,只能往委托里面来添加函数,而不能触发函数调用,触发函数调用,只有 模块A,这个就是 event 修饰的作用。