Unity 之 C# 利用回调函数实现C++匿名函数
做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++匿名函数的更多相关文章
- python----内置函数2与匿名函数
1.迭代器生成器相关 range:创建一个可迭代对象,一般与for混合使用,可设置步长. for i in range(0,10,2): #步长2范围为0-10不包括10 print(i) # 0 2 ...
- JavaScript 函数声明,函数表达式,匿名函数,立即执行函数之区别
函数声明:function fnName () {-};使用function关键字声明一个函数,再指定一个函数名,叫函数声明. 函数表达式 var fnName = function () {-};使 ...
- JS函数定义与匿名函数的调用
一.函数声明.函数表达式.匿名函数 函数声明:function fnName () {…};使用function关键字 声明一个函数,再指定一个函数名,叫函数声明. 函数表达式 var fnName ...
- Python第七天 函数 函数参数 函数里的变量 函数返回值 多类型传值 函数递归调用 匿名函数 内置函数
Python第七天 函数 函数参数 函数里的变量 函数返回值 多类型传值 函数递归调用 匿名函数 内置函数 目录 Pycharm使用技巧(转载) Python第一天 ...
- 深入理解,函数声明、函数表达式、匿名函数、立即执行函数、window.onload的区别.
一.函数声明.函数表达式.匿名函数1.函数声明:function fnName () {…};使用function关键字声明一个函数,再指定一个函数名,叫函数声明. 2.函数表达式 var fnNam ...
- JavaScript 函数声明,函数表达式,匿名函数的区别,深入理解立即执行函数(function(){…})()
function fnName(){xxxx}; // 函数声明:使用function关键字声明一个函数,在指定一个函数名. //例如:(正常,因为 提升 了函数声明,函数调用可以在函数声明之前) f ...
- Python的程序结构[4] -> 函数/Function[2] -> 匿名函数
匿名函数 / Anonymous Function 匿名函数是一种不需要绑定函数名的函数 (i.e. functions that are not bound to a name).匿名函数通过 la ...
- js循环函数中的匿名函数和闭包问题(匿名函数要用循环中变量的问题)
js循环函数中的匿名函数和闭包问题(匿名函数要用循环中变量的问题) 一.总结 需要好好看下面代码 本质是因为匿名函数用到了循环中的变量,而普通方式访问的话,匿名函数的访问在循环之后,所以得到的i是循环 ...
- js闭包(函数内部嵌套一个匿名函数:这个匿名函数可将所在函数的局部变量常驻内存)
js闭包(函数内部嵌套一个匿名函数:这个匿名函数可将所在函数的局部变量常驻内存) 一.总结 1.闭包:就是在一个函数内部嵌套一个匿名函数,这个匿名函数可以访问这个函数的变量. 二.要点 闭包 闭包的相 ...
- js进阶ajax函数封装(匿名函数作为参数传递)(封装函数引入文件的方式非常好用)
js进阶ajax函数封装(匿名函数作为参数传递)(封装函数引入文件的方式非常好用) 一.总结 2.匿名函数作为参数传递 二.js进阶ajax函数封装 ajax1.js function ajax(ur ...
随机推荐
- mysql和mongodb的区别
1.mongodb的概括 MongoDB(文档型数据库):提供可扩展的高性能数据存储 2.mongodb的功能概括 (1)基于分布式文件存储 (2)高负载情况下添加更多节点,可以保证服务器性能 (3) ...
- NOIp2018模拟赛四十
今天太晚了...题解到时候补吧(flag立好) 成绩:100+0+0=100 感觉A题本质暴力贪心?C题一道水题我居然没做...亏爆 A:[agc011e]increasing numbers B:[ ...
- VMware exsi 虚拟化嵌套
默认情况下exsi 虚拟化嵌套是没开启的 需要我们连接exsi主机,从后台找到对应的虚拟机修改配置文件开启虚拟化功能 1.连接exsi主机,开启ssh功能 2.ssh到exsi主机,修改配置文件 查找 ...
- 关于__str__的介绍
在python语言里,__str__一般是格式是这样的. class A: def __str__(self): return "this is in str" 事实上,__str ...
- Fiddler 接口测试(Composer)的使用方法
原文:Fiddler 接口测试(Composer)的使用方法 下载地址:https://www.telerik.com/download/fiddler 一.Composer简介 右侧Composer ...
- ztree实现根节点单击事件,显示节点信息
这段时间在维护公司的项目,去年做的项目里面有ztree树的例子,想起之前还没有开始写博客,一些知识点也无从找起,要新加一个右击节点事件,折腾了半天,其中也包含了一些知识点,稍稍做了一些demo. zT ...
- Objective-C的陷阱与缺陷
Objective-C是一个强大而且非常有用的语言,但是同样也是有一点危险的.这次主题是受到一篇有关C++陷阱的文章启发,来聊聊Objective-C和Cocoa中的陷阱. 简介 我将和Horstma ...
- 零基础学python-6.2 共享引用
这一章节说说共享引用 我们先举一个样例 a=1 b=a 上面的样例就是共享引用,这里我们说说整个过程: 1.创建一个对象1 2.创建一个变量a 3.把a和1所在的内存空间连接起来.就是a引用1 4.a ...
- openSessionInView的使用原理及性能分析
看到好多项目中用到了openSessionInView,这种做法无非是开发方便,能够在JSP页面中操作数据库层方面的业务. 下边说下openSessionInView的使用方法及性能问题. 使用: 1 ...
- java 短连接+MD5加密短链接
java 短连接+MD5加密短链接 import java.security.MessageDigest; public class ShotUrlUtil { public static void ...