zoukankan      html  css  js  c++  java
  • 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);
    	}
    }


  • 相关阅读:
    从小知识开始练习
    shell的基本语法
    shell的一些简单用法
    HTML 父元素与子元素之间的margin-top问题
    HTML input文本框设置和移除默认值
    c# winform进入窗口后在文本框里的默认焦点
    c#面向对象基础 重写、虚方法、抽象类
    c#面向对象基础 封装、继承
    c#面向对象基础 静态成员、构造函数、命名空间与类库
    c#面向对象基础 类、方法、方法重载
  • 原文地址:https://www.cnblogs.com/brucemengbm/p/6937070.html
Copyright © 2011-2022 走看看