委托

通过委托,可以在脚本中创建可靠且复杂的行为;

委托可以简单的视为盛放函数的容器,可以进行传递或像变量一样使用,像变量一样,可以向委托分配值,并且这些值可以在运行时更改

区别在于变量包含数据,而委托包含函数

首先要做的是清除委托模板,这个模板将明确指示可以分配给委托哪些类型的方法

我们用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

posted @ 2022-09-14 15:58  无敌小金刚  阅读(82)  评论(0编辑  收藏  举报