做C++开发的都用过匿名函数很好用,可是C#开发怎么实现呢?前几天做一个拍照功能的时候。我偶然发现某个函数假设是C++的话。用匿名函数太好了,于是開始研究C#的回调,代理。托付等,最后总算是实现了我想要的吧。不知道究竟算什么调用。有大神的话能够给出评价。

參考文章:

具体解释C#托付,事件与回调函数Unity3D研究院之利用C#实现代理模式(四十)


直接上代码吧。不废话了。A类是托付的定义类,B类是调用托付(匿名函数)的类。

using UnityEngine;
using System.Collections; public class AClass{ public delegate void onComplete(Sprite sprite); public IEnumerator GetTexture(onComplete callback)
{
//save
Texture2D t=new Texture2D(Screen.width,(int)(Screen.width*aspect));
t.ReadPixels(new Rect(0,0,Screen.width,(int)(Screen.width*aspect)),0,0,false);
t.Apply();
byte[] byt = t.EncodeToPNG();
m_photoName = Time.time+".png";
m_photoPath = Globe.persistentDataUrl+m_photoName; Debug.Log("System.IO++++++++Start WritePng");
System.IO.File.WriteAllBytes(m_photoPath.Replace("file://",""),byt); Debug.Log("m_photoPath="+m_photoPath);
//load image
WWW www = new WWW(m_photoPath);
yield return www; //回调
callback(sprite);
}
}
using UnityEngine;
using System.Collections; public class BClass{ public void ExecuteCallBack(){ StartCoroutine(m_webCamera.GetTexture(delegate(Sprite sp)
{
watermark.gameObject.SetActive(false);
photoImg.sprite=sp;
}));
}
}

A类中定义了一个用于回调的Delegate,參数是要传递的精灵类。GetTexture方法是用于截屏的方法。

B类中是调用方式,当B类调用A类的截屏方法时,能够直接通过Delegate(Sprite sp) 匿名函数来获取到sp得图片。应为A类中截屏方法中。使用了WWW的异步载入,所以B类中的给PhotoImg的精灵赋值也是异步的。

**注意事项,普通情况下呢,不须要异步的情况下,是不须要写StartCoroutine()的,那么就把代码简单的改一下就OK了

using UnityEngine;
using System.Collections; public class BClass{ public void ExecuteCallBack(){ //StartCoroutine();
m_webCamera.GetTexture(delegate(Sprite sp)
{
watermark.gameObject.SetActive(false);
photoImg.sprite=sp;
});
}
}

可是。普通情况下使用匿名函数,多数人会想使用异步,这个时候StartCoroutine() 必须在调用的使用,即在B类中调用。假设在B类中不使用StartCortine() 而在A类中使用

即,在B类中调用A类的截屏方法

	public void ExecuteCallBack(){

		//StartCoroutine();

		m_webCamera.GetTexture(delegate(Sprite sp);

		m_webCamera.GetTexture(delegate(Sprite sp)
{
watermark.gameObject.SetActive(false);
photoImg.sprite=sp;
});
}

而在A类的截屏其中使用StartCoroutine() 方法启用异步,则会出现空指针异常。这是我在使用过程中碰到的问题。困扰了我有一会儿呢,希望大家注意!!


using UnityEngine;
using System.Collections; public class AClass{ public delegate void onComplete(Sprite sprite); public void GetTexture(onComplete callback){ StartCoroutine(ScreenCapture(callback));
} public IEnumerator ScreenCapture(onComplete callback)
{
//save
Texture2D t=new Texture2D(Screen.width,(int)(Screen.width*aspect));
t.ReadPixels(new Rect(0,0,Screen.width,(int)(Screen.width*aspect)),0,0,false);
t.Apply();
byte[] byt = t.EncodeToPNG();
m_photoName = Time.time+".png";
m_photoPath = Globe.persistentDataUrl+m_photoName; Debug.Log("System.IO++++++++Start WritePng");
System.IO.File.WriteAllBytes(m_photoPath.Replace("file://",""),byt); Debug.Log("m_photoPath="+m_photoPath);
//load image
WWW www = new WWW(m_photoPath);
yield return www; //回调 callback(sprite);
}
}

Unity 之 C# 利用回调函数实现C++匿名函数的更多相关文章

  1. python----内置函数2与匿名函数

    1.迭代器生成器相关 range:创建一个可迭代对象,一般与for混合使用,可设置步长. for i in range(0,10,2): #步长2范围为0-10不包括10 print(i) # 0 2 ...

  2. JavaScript 函数声明,函数表达式,匿名函数,立即执行函数之区别

    函数声明:function fnName () {-};使用function关键字声明一个函数,再指定一个函数名,叫函数声明. 函数表达式 var fnName = function () {-};使 ...

  3. JS函数定义与匿名函数的调用

    一.函数声明.函数表达式.匿名函数 函数声明:function fnName () {…};使用function关键字 声明一个函数,再指定一个函数名,叫函数声明. 函数表达式 var fnName ...

  4. Python第七天 函数 函数参数 函数里的变量 函数返回值 多类型传值 函数递归调用 匿名函数 内置函数

    Python第七天   函数  函数参数   函数里的变量   函数返回值  多类型传值     函数递归调用   匿名函数   内置函数 目录 Pycharm使用技巧(转载) Python第一天   ...

  5. 深入理解,函数声明、函数表达式、匿名函数、立即执行函数、window.onload的区别.

    一.函数声明.函数表达式.匿名函数1.函数声明:function fnName () {…};使用function关键字声明一个函数,再指定一个函数名,叫函数声明. 2.函数表达式 var fnNam ...

  6. JavaScript 函数声明,函数表达式,匿名函数的区别,深入理解立即执行函数(function(){…})()

    function fnName(){xxxx}; // 函数声明:使用function关键字声明一个函数,在指定一个函数名. //例如:(正常,因为 提升 了函数声明,函数调用可以在函数声明之前) f ...

  7. Python的程序结构[4] -> 函数/Function[2] -> 匿名函数

    匿名函数 / Anonymous Function 匿名函数是一种不需要绑定函数名的函数 (i.e. functions that are not bound to a name).匿名函数通过 la ...

  8. js循环函数中的匿名函数和闭包问题(匿名函数要用循环中变量的问题)

    js循环函数中的匿名函数和闭包问题(匿名函数要用循环中变量的问题) 一.总结 需要好好看下面代码 本质是因为匿名函数用到了循环中的变量,而普通方式访问的话,匿名函数的访问在循环之后,所以得到的i是循环 ...

  9. js闭包(函数内部嵌套一个匿名函数:这个匿名函数可将所在函数的局部变量常驻内存)

    js闭包(函数内部嵌套一个匿名函数:这个匿名函数可将所在函数的局部变量常驻内存) 一.总结 1.闭包:就是在一个函数内部嵌套一个匿名函数,这个匿名函数可以访问这个函数的变量. 二.要点 闭包 闭包的相 ...

  10. js进阶ajax函数封装(匿名函数作为参数传递)(封装函数引入文件的方式非常好用)

    js进阶ajax函数封装(匿名函数作为参数传递)(封装函数引入文件的方式非常好用) 一.总结 2.匿名函数作为参数传递 二.js进阶ajax函数封装 ajax1.js function ajax(ur ...

随机推荐

  1. sass的用法小结(一)

    1. 使用变量; sass让人们受益的一个重要特性就是它为css引入了变量.你可以把反复使用的css属性值 定义成变量,然后通过变量名来引用它们,而无需重复书写这一属性值.或者,对于仅使用过一 次的属 ...

  2. SPA SEO SSR三者有什么区别

    SPA通俗的说就是单页面应用(single page application) 优点 页面之间的切换非常快 一定程度减少了后端服务器的压力 后端程序只需要提供api,不需要客户端到底是web端还是手机 ...

  3. [ZJOI2015]幻想乡战略游戏(点分树)

    题意自己看... 思路 没想到今(昨)天刷着刷着点分治的水题,就刷出来了一个点分树... 然后就疯狂地找题解,代码,最后终于把它给弄懂了. 点分树——动态点分治,对于此题来说,我们设u为当前的补给站位 ...

  4. CentOS7 部署SVN服务器

    服务器端:svnserver 安装主要步骤 yum install subversion rpm -ql subversion mkdir /application/svndata mkdir /ap ...

  5. hook中ref使用

    hook使用ref 父组件: 引入                  useRef 声明ref的名字     const dateRef = useRef() 复值给组件         ref={d ...

  6. Mysql学习总结(23)——MySQL统计函数和分组查询

    1.使用count统计条数:select count(字段名...) from tablename; 2.使用avg计算字段的平均值:select avg(字段名) from tablename: 这 ...

  7. [转载]深入Java单例模式

    在GoF的23种设计模式中,单例模式是比较简单的一种.然而,有时候越是简单的东西越容易出现问题.下面就单例设计模式详细的探讨一下.   所谓单例模式,简单来说,就是在整个应用中保证只有一个类的实例存在 ...

  8. C++容器(五):set类型

    set类型 map容器是键-值对的集合,好比以任命为键的地址和电话号码.而set容器只是单纯的键的集合.当只想知道一个值是否存在时,使用set容器是最适合. 使用set容器必须包含set头文件: #i ...

  9. POJ 3254 Corn Fields 状态压缩DP (C++/Java)

    id=3254">http://poj.org/problem? id=3254 题目大意: 一个农民有n行m列的地方,每一个格子用1代表能够种草地,而0不能够.放牛仅仅能在有草地的. ...

  10. 为什么button在设置标题时要用一个方法,而不像lable一样直接用一个属性

    为什么button在设置标题时要用一个方法.而不像lable一样直接用一个属性 原因是有时我们对      button做一次点击,须要改变button的标题.仅仅实用方法才干做到,而label是标签 ...