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