1. 程式人生 > 其它 >Unity_C#委託與事件——委託的進一步使用

Unity_C#委託與事件——委託的進一步使用

技術標籤:c#unity

經過上一篇文章的複習,想來各位也已經初步瞭解了什麼是委託以及委託的基礎使用,那麼今天我們即將進一步的對委託進行使用:

  • 邏輯的插入執行:

如下,我有一個方法,裡面有兩個語句:

    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#,而是你不適合做一個程式設計師。”