程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> [unity3d]unity中C#委托的應用

[unity3d]unity中C#委托的應用

編輯:C#入門知識

C#中有一種還是挺實用的類型,就是委托類型,這也是初學者比較難理解的類型,我們常常將委托和事件合起來講,其實他們兩是有些區別的,委托(delegate)是一種類型,而事件(Event)是一種實例(委托中的一種)。下面我就從參考網上的一個例子,講解一下unity中C#委托的應用。

我們新建一個腳本,取名TestDelegate。這個主要的功能就是點擊中文按鈕輸出中文名字,點擊英文按鈕輸出英文名字。這裡有兩個函數分別實現了這兩個功能。如果不用委托,可以用if else,switch來實現,相比新手用的是比較多的,但大牛們的代碼一般比較少出現,所以這就告示我們要對我們的代碼進行仔細的研究,下面就看一下代碼:

using UnityEngine;
using System.Collections;

public class TestDelegate : MonoBehaviour
{

    //定義一個委托(格式是不是很類很像),用來指向我們某個函數。(c++裡面的指針函數)
    //param參數是名字
    private delegate void DebugString(string param);

    /// 
    /// 輸出中文名字
    /// 
    public void DebugNameOfChina(string str)
    {
        Debug.Log("中文名字:" + str);
    }

    /// 
    /// 輸出英文名字
    /// 
    public void DebugNameOfEnglish(string str)
    {
        Debug.Log("English Name:" + str);
    }

    //定義一個委托的變量事件
    private DebugString handlerDebugString;


    void OnGUI()
    {
        if (GUILayout.Button("輸出中文名字"))
        {
            //我想輸出中文名字的話就給handlerDebugString  賦值成輸出中文名字的這個函數DebugNameOfChina
            handlerDebugString = DebugNameOfChina;
            handlerDebugString("丁小未");
        }
        else if (GUILayout.Button("Debug English Name"))
        {
            //我想輸出英文名字的話就給handlerDebugString  賦值成輸出中文名字的這個函數DebugNameOfEnglish
            handlerDebugString = DebugNameOfEnglish;
            handlerDebugString("DingXiaowei");
        }
    }
}

這裡參考了一些網上的教程,@與現實沖突的教程寫的比較不錯,但我也加入一點自己的理解,我個人理解這個委托有點類似就是指針函數的意味,定義一個委托變量,也就類似C/C++中的函數指針,指向哪個函數就調用執行該函數的功能。

然後我們運行一下,看一下效果:

\ \


了解過C/C++的同學一類比函數指針也就比較容易理解了,其實也就那麼回事,想要用哪個函數就指向這個函數,然後去調用這個函數的方法,其實委托還有+=和-=也就是多路廣播機制,下面舉例:

using UnityEngine;
using System.Collections;

public class TestDelegate : MonoBehaviour
{

    //定義一個委托(格式是不是很類很像),用來指向我們某個函數。(c++裡面的指針函數)
    //param參數是名字
    private delegate void DebugString(string param);

    /// 
    /// 輸出中文名字
    /// 
    public void DebugNameOfChina(string str)
    {
        Debug.Log("中文名字:" + str);
    }

    /// 
    /// 輸出英文名字
    /// 
    public void DebugNameOfEnglish(string str)
    {
        Debug.Log("English Name:" + str);
    }

    //定義一個委托的變量事件
    private DebugString handlerDebugString;


    void Start()
    {
        //給委托對象賦值
        handlerDebugString = DebugNameOfChina;
        handlerDebugString("丁小未");
        Debug.Log("................................");

        //給委托對象再加一個事件,叫多路廣播
        handlerDebugString += DebugNameOfEnglish;
        handlerDebugString("DingXiaowei");
        Debug.Log("................................");
        
        //輸出中文試試
        handlerDebugString("丁小未");
        Debug.Log("................................");

        //給委托對象減去一個事件
        handlerDebugString -= DebugNameOfChina;
        handlerDebugString("DingXiaowei");

    }

}

大家猜猜結果是啥,跟你預期的是不是一樣的呢?


可能覺得容易出錯的就是第二條和第三條,也就是紅色部分,他是分別執行了這兩個事件,我們後來加上了一個事件嘛,所以就都執行一遍,然後參數就是委托方法帶的參數,委托這是C#的基礎知識,跟unity沒關系,unity知識一個UI展示的界面而已,後帶支持的還是C#語言,所以在學習unity開發的時候,C#/.NET基礎學好還是很有必要的!


==================== 迂者 丁小未 CSDN博客專欄=================

MyBlog:http://blog.csdn.net/dingxiaowei2013 MyQQ:1213250243

Unity QQ群:858550 cocos2dx QQ群:280818155

====================== 相互學習,共同進步 ===================

轉載請注明出處:http://blog.csdn.net/dingxiaowei2013/article/details/18428727

歡迎關注我的微博:http://weibo.com/u/2590571922


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved