unity3d中C#委托的应用
来源:互联网 发布:手机上怎样查淘宝积分 编辑:程序博客网 时间:2024/06/06 02:22
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);
- /// <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");
- }
- }
- }
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++的同学一类比函数指针也就比较容易理解了,其实也就那么回事,想要用哪个函数就指向这个函数,然后去调用这个函数的方法,其实委托还有+=和-=也就是多路广播机制,下面举例:
- 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");
- }
- }
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 0
- [unity3d]unity中C#委托的应用
- unity3d中C#委托的应用
- unity中C#委托的应用
- unity中C#委托的应用
- c# 委托的应用
- c# 委托的应用
- C#委托的应用
- Unity3D中c#集合的应用
- Unity3D中c#集合的应用
- 深入对C#中委托的理解及应用
- c# sharp 中委托做参数的一个应用
- C# 委托事件的应用
- Unity3D 中使用C# 委托和事件(之二)
- C#中委托的理解
- C#中委托的演变
- c#中委托是啥样的?
- C#中委托的运用
- C#中委托的调用
- 重新认识c++(01),做个简单的复数Complex类
- MSSQL与MySQL语法区别
- ARM ADC程序设计
- 毕业论文参考文献规范格式
- 我们什么时候应该使用异常
- unity3d中C#委托的应用
- Android的shape和颜色选择器结合使用
- C++模版的特化
- Android即时通信系 之openfire安装
- Android中 int 和 String 互相转换的多种方法
- 机器学习笔记目录
- IE8"开发人员工具"使用详解下(浏览器模式、文本模式、JavaScript调试、探查器)
- Getting in Line
- Eclipse上安装GIT插件EGit及使用