unity3d中C#委托的应用

C#中有一种还是挺实用的类型,就是委托类型,这也是初学者比较难理解的类型,我们常常将委托和事件合起来讲,其实他们两是有些区别的,委托(delegate)是一种类型,而事件(Event)是一种实例(委托中的一种)。下面我就从参考网上的一个例子,讲解一下unity中C#委托的应用。

我们新建一个脚本,取名TestDelegate。这个主要的功能就是点击中文按钮输出中文名字,点击英文按钮输出英文名字。这里有两个函数分别实现了这两个功能。如果不用委托,可以用if else,switch来实现,相比新手用的是比较多的,但大牛们的代码一般比较少出现,所以这就告示我们要对我们的代码进行仔细的研究,下面就看一下代码:

  1. using UnityEngine;  
  2. using System.Collections;  
  3.   
  4. public class TestDelegate : MonoBehaviour  
  5. {  
  6.   
  7.     //定义一个委托(格式是不是很类很像),用来指向我们某个函数。(c++里面的指针函数)   
  8.     //param参数是名字   
  9.     private delegate void DebugString(string param);  
  10.   
  11.     /// <summary>   
  12.     /// 输出中文名字   
  13.     /// </summary>   
  14.     public void DebugNameOfChina(string str)  
  15.     {  
  16.         Debug.Log("中文名字:" + str);  
  17.     }  
  18.   
  19.     /// <summary>   
  20.     /// 输出英文名字   
  21.     /// </summary>   
  22.     public void DebugNameOfEnglish(string str)  
  23.     {  
  24.         Debug.Log("English Name:" + str);  
  25.     }  
  26.   
  27.     //定义一个委托的变量事件   
  28.     private DebugString handlerDebugString;  
  29.   
  30.   
  31.     void OnGUI()  
  32.     {  
  33.         if (GUILayout.Button("输出中文名字"))  
  34.         {  
  35.             //我想输出中文名字的话就给handlerDebugString  赋值成输出中文名字的这个函数DebugNameOfChina   
  36.             handlerDebugString = DebugNameOfChina;  
  37.             handlerDebugString("丁小未");  
  38.         }  
  39.         else if (GUILayout.Button("Debug English Name"))  
  40.         {  
  41.             //我想输出英文名字的话就给handlerDebugString  赋值成输出中文名字的这个函数DebugNameOfEnglish   
  42.             handlerDebugString = DebugNameOfEnglish;  
  43.             handlerDebugString("DingXiaowei");  
  44.         }  
  45.     }  
  46. }  
using UnityEngine;
using System.Collections;

public class TestDelegate : MonoBehaviour
{

    //定义一个委托(格式是不是很类很像),用来指向我们某个函数。(c++里面的指针函数)
    //param参数是名字
    private delegate void DebugString(string param);

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

    /// <summary>
    /// 输出英文名字
    /// </summary>
    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++的同学一类比函数指针也就比较容易理解了,其实也就那么回事,想要用哪个函数就指向这个函数,然后去调用这个函数的方法,其实委托还有+=和-=也就是多路广播机制,下面举例:

  1. using UnityEngine;  
  2. using System.Collections;  
  3.   
  4. public class TestDelegate : MonoBehaviour  
  5. {  
  6.   
  7.     //定义一个委托(格式是不是很类很像),用来指向我们某个函数。(c++里面的指针函数)   
  8.     //param参数是名字   
  9.     private delegate void DebugString(string param);  
  10.   
  11.     /// <summary>   
  12.     /// 输出中文名字   
  13.     /// </summary>   
  14.     public void DebugNameOfChina(string str)  
  15.     {  
  16.         Debug.Log("中文名字:" + str);  
  17.     }  
  18.   
  19.     /// <summary>   
  20.     /// 输出英文名字   
  21.     /// </summary>   
  22.     public void DebugNameOfEnglish(string str)  
  23.     {  
  24.         Debug.Log("English Name:" + str);  
  25.     }  
  26.   
  27.     //定义一个委托的变量事件   
  28.     private DebugString handlerDebugString;  
  29.   
  30.   
  31.     void Start()  
  32.     {  
  33.         //给委托对象赋值   
  34.         handlerDebugString = DebugNameOfChina;  
  35.         handlerDebugString("丁小未");  
  36.         Debug.Log("................................");  
  37.   
  38.         //给委托对象再加一个事件,叫多路广播   
  39.         handlerDebugString += DebugNameOfEnglish;  
  40.         handlerDebugString("DingXiaowei");  
  41.         Debug.Log("................................");  
  42.           
  43.         //输出中文试试   
  44.         handlerDebugString("丁小未");  
  45.         Debug.Log("................................");  
  46.   
  47.         //给委托对象减去一个事件   
  48.         handlerDebugString -= DebugNameOfChina;  
  49.         handlerDebugString("DingXiaowei");  
  50.   
  51.     }  
  52.   
  53. }  
using UnityEngine;
using System.Collections;

public class TestDelegate : MonoBehaviour
{

    //定义一个委托(格式是不是很类很像),用来指向我们某个函数。(c++里面的指针函数)
    //param参数是名字
    private delegate void DebugString(string param);

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

    /// <summary>
    /// 输出英文名字
    /// </summary>
    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基础学好还是很有必要的!

 

转载出处:http://blog.csdn.net/dingxiaowei2013/article/details/18428727

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值