委托
通过委托,可以在脚本中创建可靠且复杂的行为;
委托可以简单的视为盛放函数的容器,可以进行传递或像变量一样使用,像变量一样,可以向委托分配值,并且这些值可以在运行时更改
区别在于变量包含数据,而委托包含函数
首先要做的是清除委托模板,这个模板将明确指示可以分配给委托哪些类型的方法
我们用delegate关键字创建委托,delegate关键字后面是委托的签名
与函数一样,委托有返回值类型 名称和参数列表,,在本例中,我们看到我们要将方法分配给这个委托,它的返回值必须是void,并接受单个整数参数,创建委托类型之后,声明成员变量,这个成员变量拥有刚刚创建的委托的类型,脚本底部的两个方法,可以看到两个方法党的返回值都是void,并接受单个整数参数,这与我们的委托一样;此外每一个方法对传入的整数数据的处理略有不同,接下来我们来看一下委托的具体用途:我们能够使用同一个委托变量,调用两个不同的方法,这让我们能够更好的动态控制在游戏里调用哪些函数
public class Delegate : MonoBehaviour { // Start is called before the first frame update delegate void MyDelegate(int num); MyDelegate myDelegate; void Start() { myDelegate = PrintNum; myDelegate(50); myDelegate = DoubleNum; myDelegate(50); } void PrintNum(int num) { print("Print Num"+num); } void DoubleNum(int num) { print("Double Num"+num*2); } // Update is called once per frame void Update() { } }
委托还支持多播,多播允许单个委托变量同时代表多个方法,如下所示,我们将PowerUp与TurnRed两个方法,通过+=的方法将两个方法赋给同一个委托变量,这样一个委托变量就同时包含了两个方法,然后我们把声明的成员变量MultiDelegate当作函数使用
public class Delegate : MonoBehaviour { // Start is called before the first frame update delegate void MultiDelegate(); MultiDelegate myMultiDelegate; void Start() { myMultiDelegate += PowerUp; myMultiDelegate += TurnRed; } void PowerUp() { print("Orb is powerUp"); } void TurnRed() { print("red"); } // Update is called once per frame void Update() { } }
通过这种功能,我们可以为物体叠加功能;如果要从委托变量中移除方法,我们可以使用 -=运算符结合方法名称进行删除;
必须注意一点的是:如果在向委托变量分配之前,尝试将其作为函数进行调用,这种做法将引发错误,我们应该避免。
目前未分配到方法的任何委托变量的值为NUll。因此在使用前经常检查以确保委托不等于NULL