做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. mysql和mongodb的区别

    1.mongodb的概括 MongoDB(文档型数据库):提供可扩展的高性能数据存储 2.mongodb的功能概括 (1)基于分布式文件存储 (2)高负载情况下添加更多节点,可以保证服务器性能 (3) ...

  2. NOIp2018模拟赛四十

    今天太晚了...题解到时候补吧(flag立好) 成绩:100+0+0=100 感觉A题本质暴力贪心?C题一道水题我居然没做...亏爆 A:[agc011e]increasing numbers B:[ ...

  3. VMware exsi 虚拟化嵌套

    默认情况下exsi 虚拟化嵌套是没开启的 需要我们连接exsi主机,从后台找到对应的虚拟机修改配置文件开启虚拟化功能 1.连接exsi主机,开启ssh功能 2.ssh到exsi主机,修改配置文件 查找 ...

  4. 关于__str__的介绍

    在python语言里,__str__一般是格式是这样的. class A: def __str__(self): return "this is in str" 事实上,__str ...

  5. Fiddler 接口测试(Composer)的使用方法

    原文:Fiddler 接口测试(Composer)的使用方法 下载地址:https://www.telerik.com/download/fiddler 一.Composer简介 右侧Composer ...

  6. ztree实现根节点单击事件,显示节点信息

    这段时间在维护公司的项目,去年做的项目里面有ztree树的例子,想起之前还没有开始写博客,一些知识点也无从找起,要新加一个右击节点事件,折腾了半天,其中也包含了一些知识点,稍稍做了一些demo. zT ...

  7. Objective-C的陷阱与缺陷

    Objective-C是一个强大而且非常有用的语言,但是同样也是有一点危险的.这次主题是受到一篇有关C++陷阱的文章启发,来聊聊Objective-C和Cocoa中的陷阱. 简介 我将和Horstma ...

  8. 零基础学python-6.2 共享引用

    这一章节说说共享引用 我们先举一个样例 a=1 b=a 上面的样例就是共享引用,这里我们说说整个过程: 1.创建一个对象1 2.创建一个变量a 3.把a和1所在的内存空间连接起来.就是a引用1 4.a ...

  9. openSessionInView的使用原理及性能分析

    看到好多项目中用到了openSessionInView,这种做法无非是开发方便,能够在JSP页面中操作数据库层方面的业务. 下边说下openSessionInView的使用方法及性能问题. 使用: 1 ...

  10. java 短连接+MD5加密短链接

    java 短连接+MD5加密短链接 import java.security.MessageDigest; public class ShotUrlUtil { public static void ...