unity 协程与async、await

摘要:
yieldreturn是暂停执行并随后在下一个时间点恢复。禁用MonoBehaviour时,不会停止协程,仅在明确销毁MonoBehaviour时才会停止协程。MonoBehaviour所绑定的GameObject,SetActive时,也会停止协程usingUnityEngine;usingSystem.Collections;publicclassTest:MonoBehaviour{privateCanvasGroupm_canvasGroup;privatevoidStart(){m_canvasGroup=GetComponent();StartCoroutine;//StartCoroutine;}IEnumeratorDelay(){Debug.Log;yieldreturnnewWaitForSeconds;Debug.Log;}IEnumeratorFade(){for{m_canvasGroup.alpha=f;Debug.Log;//yieldreturnnewWaitForFixedUpdate();//等待,直到下一个固定帧率更新函数//yieldreturnnull;//等待下一帧执行,在Update后,LateUpdate前。//yieldreturnnewWaitForSeconds;//使用缩放时间将协程执行暂停指定的秒数。//yieldreturnnewWaitWhile;//暂停协程执行,直到提供的委托评估为/false/。

协程(Coroutine)

协程就像一个函数,能够暂停执行并将控制权返还给 Unity,然后在指定的时间继续执行。
协程本质上是一个用返回类型 IEnumerator 声明的函数,并在主体中的某个位置包含 yield return 语句。
yield return 是暂停执行并随后在下一个时间点恢复。
注意:
Fade 函数中的循环计数器能够在协程的生命周期内保持正确值。实际上,在 yield 语句之间可以正确保留任何变量或参数。

禁用 MonoBehaviour 时,不会停止协程,仅在明确销毁 MonoBehaviour 时才会停止协程。
可以使用 MonoBehaviour.StopCoroutine 和 MonoBehaviour.StopAllCoroutines 来停止协程。
销毁 MonoBehaviour 时,也会停止协程。
MonoBehaviour所绑定的GameObject,SetActive(false)时,也会停止协程

using UnityEngine;
using System.Collections;

public class Test:MonoBehaviour{
	
	private CanvasGroup m_canvasGroup;
	
	private void Start(){
		m_canvasGroup=GetComponent<CanvasGroup>();
		StartCoroutine(Delay());
		//StartCoroutine(Fade());
	}

	IEnumerator Delay(){
		Debug.Log("暂停执行5秒");
		yield return new WaitForSeconds(5);
		Debug.Log("等待完成");
	}

	IEnumerator Fade(){
		for (float f=1f;f>=0;f-=0.1f){
			m_canvasGroup.alpha=f;
			Debug.Log(m_canvasGroup.alpha);
			//yield return new WaitForFixedUpdate();//等待,直到下一个固定帧率更新函数
			//yield return null;//等待下一帧执行,在Update后,LateUpdate前。**注意:null、任意数字、字符串、true、false效果一样**
			//yield return new WaitForEndOfFrame();//等待,直到该帧结束,在渲染所有摄像机和 GUI 之后,在屏幕上显示该帧之前,LateUpdate后。
			//yield return new WaitForSecondsRealtime(5);//使用未缩放时间将协同程序执行暂停指定的秒数。
			//yield return new WaitForSeconds(5);//使用缩放时间将协程执行暂停指定的秒数。
			//yield return new WaitWhile(() => frame < 10);//暂停协程执行,直到提供的委托评估为 /false/。
			//yield return new WaitUntil(() => frame >= 10);//暂停协程执行,直到提供的委托评估为 /true/。
			yield return null;
		}
		Debug.Log("complete");
	}
}

async、await

using System;
using System.Threading.Tasks;
using UnityEngine;

public class Test:MonoBehaviour{
	
	private CanvasGroup m_canvasGroup;
	
	private void Start(){
		m_canvasGroup=GetComponent<CanvasGroup>();
		//Delay();
		Fade();
	}

	private async void Delay(){
		Debug.Log("暂停执行5秒");
		int ms=5000;
		await Task.Delay(ms);
		Debug.Log("等待完成");
	}

	private async void Fade(){
		for (float f=1f;f>=0;f-=0.1f){
			m_canvasGroup.alpha=f;
			Debug.Log(m_canvasGroup.alpha);
			int ms=Convert.ToInt32(Time.deltaTime*1000f);
			await Task.Delay(ms);
		}
		Debug.Log("complete");
	}
}

延时过程中取消

using System;
using System.Threading;
using System.Threading.Tasks;
using UnityEngine;
public class Test:MonoBehaviour{    
    private CancellationTokenSource _sayHelloTokenSource;
    private void Start () {
        _sayHelloTokenSource=new CancellationTokenSource();
        //延时5秒输出"Hello"
        delaySayHello(5000,_sayHelloTokenSource);
        //在2秒的时候取消输出"Hello"
        delayDestroyTask(2000);
        //
        Debug.Log("Start"+","+Time.time);
    }
    private async void delayDestroyTask(int ms){
        await Task.Delay(ms);
        Debug.Log("cancel delay say hello"+","+Time.time);
        _sayHelloTokenSource.Cancel();
    }
    private async void delaySayHello(int ms,CancellationTokenSource tokenSource){
        try{
            await Task.Delay(ms,tokenSource.Token);
        }catch (Exception){
        }
        if(!tokenSource.IsCancellationRequested){
            Debug.Log("Hello"+","+Time.time);
        }
    }
}

免责声明:文章转载自《unity 协程与async、await》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Linux内核移植--1.添加NAND Flash分区TortoiseSVN文件夹及文件图标、标识、绿色小对号不显示解决方法(转载)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Unity3D客户端和Java服务端使用Protobuf

原文:http://blog.csdn.net/kakashi8841/article/details/17334493 前几天有位网友问我关于Unity3D里面使用Protobuf的方法,一时有事拖到现在才写这篇文章,不好意思哈。 本文测试环境: 系统:WINDOWS 7(第3、6步)、OS X 10.9(第4步) 软件:VS 2012(第3、6步)、E...

关于unity3D的GL图像库的使用

 GL图象库 GL图象库是底层的图象库,主要功能是使用程序来绘制常见的2D与3D几何图形。这些图形具有一定的特殊性,他们不属于3D网格图形,只会以面的形式渲染。使用GL图象库,可在屏幕中绘制2D几何图形,并且该几何图形将永远显示在屏幕当中,不会因为摄象机的移动而改变。2D图形的呈现方式和前面章节介绍的GUI有点类似,值得注意的是,绘制2D图像时,需要使用G...

WebGL 内嵌网页的一种解决方案

  之前使用的 ZFBrowser 嵌入方案可以发布到 Win, OS, Linux 上, 可是其它的就不行, 因为它用的谷歌内核嘛, 在 WebGL 上照理来说应该是最方便的啊, 因为它本身就是运行在浏览器内核上的, 前面的 BrowserInput 已经研究过向网页注入代码以及调用了, 现在试试在 WebGL 环境下来注入代码, 来创建简单的内嵌网页看...

Unity3d在Android环境下读取XML的注意事项

PC环境下读取一般可以直接用 XmlDocument doc = new XmlDocument(); doc.Load(path);可以直接加载进来。 path为直接路径。 此时路径可以为streamingAssets文件夹下,也可以是自己自建的文件夹下面,如果是你自己建的文件夹下打包后需要手动添加一下,就是说比如你自己在Assets文件下新建了一个Co...

用Unity模仿CSGO里的火焰效果

  CSGO里的火焰效果和真实的情况比较像,能沿着遮挡物前进,如下是模仿效果。      思路比较简单,开始想的是一圈一圈发出去,但是前圈与后圈的联系不好做,换种思路,每个方向发射一条线,这样根据上一个位置的方位先向前进,如果前面有遮挡,则计算好新的位置与方向,反之前面没有遮挡,选择合适的位置,并从这个方向的上面向下检测,检测这个方向的垂直位置有没遮挡,如...

基于Unity的AR开发初探:发布AR应用到Android平台

本文接上一篇,介绍一下如何通过Unity发布第一个AR应用至Android平台,在Android手机上使用我们的第一个AR应用。 一、一些准备工作 1.1 准备Java JDK 这里选择的是JDK 1.8.x版本,可以从这里下载。 1.2 准备Android SDK 这里选择的是R24.1.x-Windows版本,可以从这里下载。 Note:为了减少配置的...