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