Unity_C#委托与事件——委托的进一步使用

经过上一篇文章的复习,想来各位也已经初步了解了什么是委托以及委托的基础使用,那么今天我们即将进一步的对委托进行使用:

  • 逻辑的插入执行:

如下,我有一个方法,里面有两个语句:

    public void Test_One()
    {
        Debug.Log("第一句逻辑");
        Debug.Log("第三句逻辑");
    }

显而易见,这个方法中间少了 “第二句逻辑”,因为我把它写到了另一个方法里面,方法如下:

    public void Test_Two()
    {
        Debug.Log("第二句逻辑");
    }

所以我现在就想把“第二句逻辑”插入到“第一句”跟“第三句”中间执行,这时候肯定有人就会说很简单嘛,只需要把“Test_Two()”这个方法写入“Test_One()”方法中就行了,像下面这样:

    public void Test_One()
    {
        Debug.Log("第一句逻辑");
        Test_Two();
        Debug.Log("第三句逻辑");
    }
    public void Test_Two()
    {
        Debug.Log("第二句逻辑");
    }

没错,这样的确是可行的,但我这个时候改需求了,我不想插入“第二句”逻辑,我要插入其他的。

若这时候你问我:“你想要插入哪句嘛?告诉我,我直接把它写进去就行了。”
我这样回答你:“我目前还没考虑好,有可能会插入,也有可能不会插入,更有可能会插入不止一句!”

这时候你就不知道怎么办了,而委托就能够帮我们很好的解决问题,只要事先写好,我们以后想做什么都不用再去改变原有的方法“Test_One()”;

首先声明委托,再实例,传入,写好逻辑,具体写法如下:

    public delegate void DelegateTest();
    public void Test_One(DelegateTest delegateTest=null)
    {
        Debug.Log("第一句逻辑");
        if (delegateTest != null)
        {
            delegateTest.Invoke();
        }
        Debug.Log("第三句逻辑");
    }

这里我们直接让委托参数等于“null”,这样当我们不想插入逻辑的时候就可以不传参数。

之后我们测试一下,首先是不插入逻辑:

    private void Start()
    {
        Test_One();
    }

在这里插入图片描述
之后是插入逻辑:

    private void Start()
    {
        //Test_One();
        Test_One(Test_Two);
    }

在这里插入图片描述
测试完毕,两个都没有问题,接下来我们再进一步。

  • 委托的多播

先前说过,我可能会插入不止一句逻辑,即插入多个方法,那么一个委托参数可以代表多个相应方法吗?答案是当然可以,一个委托实例可以代表多个方法,这就是委托的多播:

如下,我们再写两个方法:

    public void Test_Three()
    {
        Debug.Log("第四句逻辑");
    }
    public void Test_Four()
    {
        Debug.Log("第五句逻辑");
    }

而后实例一个“DelegateTest()”:

    public delegate void DelegateTest();
    private void Start()
    {
        DelegateTest delegateTest;
    }

那么如何让这个委托实例可以代表多个方法呢?也很简单,就是累加:

    private void Start()
    {
        DelegateTest delegateTest;
        delegateTest = Test_Two;
        delegateTest += Test_Three;
        delegateTest += Test_Four;
        Test_One(delegateTest);
    }

结果如图:
测试结果
既然能够累加,自然也有减去:

    private void Start()
    {
        DelegateTest delegateTest;
        delegateTest = Test_Two;
        delegateTest += Test_Three;
        delegateTest += Test_Four;
        delegateTest -= Test_Two;
        delegateTest -= Test_Three;
        delegateTest -= Test_Four;
        Test_One(delegateTest);
    }

测试结果:
在这里插入图片描述
好了,今天就到这,最后附上完整脚本:

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using LitJson;
public class Test : MonoBehaviour
{
    public delegate void DelegateTest();
    private void Start()
    {
        DelegateTest delegateTest;
        delegateTest = Test_Two;
        delegateTest += Test_Three;
        delegateTest += Test_Four;
        delegateTest -= Test_Two;
        delegateTest -= Test_Three;
        delegateTest -= Test_Four;
        Test_One(delegateTest);
    }
    public void Test_One(DelegateTest delegateTest=null)
    {
        Debug.Log("第一句逻辑");
        if (delegateTest != null)
        {
            delegateTest.Invoke();
        }
        Debug.Log("第三句逻辑");
    }
    public void Test_Two()
    {
        Debug.Log("第二句逻辑");
    }
    public void Test_Three()
    {
        Debug.Log("第四句逻辑");
    }
    public void Test_Four()
    {
        Debug.Log("第五句逻辑");
    }
}


最后的最后,只想说一句:“委托很简单,如果你想成为一名C#程序员,却连委托也不愿意用心去弄懂,那我觉得你可以转行了,不是说你不适合写C#,而是你不适合做一个程序员。”

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值