协程

  1. 认识协程

//协程不是多线程:是一段在主程序之外执行的代码

//协程不受生命周影响

//作用:能够口直代码在特定的时间执行。

//1,延时操作

//2,等待某代码执行结束之后执行

/*

特点:1.协程与生命周期一样都在主线程,不是异步

2.协程的代码执行,是根据协程的判断条件决定的,当不满足条件时挂起,

满足条件之后唤醒,继续执行

3.协程跟生命周期一样,每一帧轮巡,在LateUpdate之后执行

4.在一个脚本中 的协程,当脚本enable=false的时候,协程继续,不受影响

当游戏对象不激活或者销毁时,

语法:

IEnumerator协程的返回值

yield return协程的判断条件

*/

IEnumerator testCoroutine() {

print(1);

yield return StartCoroutine("sunFunc");

print(2);

}

IEnumerator Father()

{

print("Father");

yield return StartCoroutine("Father");

print("000");

}

object obj=new object();

IEnumerator sun()

{

print("sun");

yield return obj;

print("222");

}

/*

yield return返回值(条件)

1.yield return 0,1,2,3,,null

print(2);

表示后面的代码等待一帧执行yield return 之后的代码(如Print(2))

2. yield return new WaitForSeconds(2);等待两秒之后执行

3. yield return StartCoroutine("sunFunc");表示新开启的子协程执行结束之后执行

4. yield return new WaitForFixedUpdate();等待FixedUpdate之后执行

5. yield return new WaitForEndOfFrame();等待GUI

6. yield return new www;等待www执行结束后执行后执行

注意:不在update中用协程,和普通方法一样可以在不用脚本中执行

协程是立刻执行的

IEnumerator sun()

{

print("sun");

yield return obj;

print("222");

}执行

*/

void Start () {

// StartCoroutine("testCoroutine");启动协程用这个进行

// StartCoroutine(testCoroutine());

StartCoroutine("sun");

// StopCoroutine(); 关闭指定的协程.执行关闭由字符串开启的协程

// StopAllCoroutines();当前脚本对象开启的所有协程

}

  1. y用www来下载图片资源

string url = "http://p0.so.qhimgs1.com/sdr/200_200_/t01b26e1155931cfd04.jpg";//图片的链接

string moveUrl ="http://www.unity3d.com/webplayers/Movie/sample.ogg";

void Start () {

StartCoroutine("downLoad");

}

IEnumerator downLoad() {

WWW www = new WWW(url);

print(www.progress);//下载的进度在这里显示

print(www.isDone);//是否下载完成

yield return www;//等待www完成

GetComponent<RawImage>().texture = www.texture;//修改Raw的文理

}

  1. 用www来下载视频资源

string moveUrl = "http://www.unity3d.com/webplayers/Movie/sample.ogg";

RawImage rawImg;//RawImage的文理可以展示视频

AudioSource aud;

//视频文件

MovieTexture mt;

// Use this for initialization

void Start () {

rawImg = GetComponent<RawImage>();

aud = GetComponent<AudioSource>();

StartCoroutine("DownLoadMovie");

}

//用于观察下载进度进度

IEnumerator DownLoadMovie() {

WWW www = new WWW(moveUrl);

while (!www.isDone) {//判断是否完成

print(www.progress);//输出进度

yield return null;

}

yield return www;

//开始播放

while (!www.GetMovieTexture().isReadyToPlay)

{

yield return null;

}

mt = www.GetMovieTexture();//获取www获取到的视频纹理

rawImg.texture = mt;//将rawImg的文理设置为已经或得到的视频文理

aud.clip = mt.audioClip;//获取视频文理中的声音片段

mt.Play();//视频播放

aud.Play();//声音播放

}

  1. www加载本地资源(图片)

Image img;

IEnumerator LoadDown()

{

string path = "file://" + Application.dataPath + "/1 (2).jpg";//本地资源的地址file://开头这是基本操作

WWW www = new WWW(path);

while(!www.isDone){

print(www.isDone);

yield return null;

}

Texture2D texture = www.texture;

Sprite sprite = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), new Vector2(0.5f, 0.5f));//使用文理创建一个精灵

img.sprite = sprite;//将图片的精灵换掉

}

void Start () {

img = GetComponent<Image>();

StartCoroutine("");

}

  1. 下载网上的资源,显示进度条,并且当本地存在视频时播放,不存在时下载

using UnityEngine;//引用类库

using UnityEngine.UI;//引用类库

using System.IO;//引用类库

public RawImage rawImg;

public Slider slider;

public Button button;

string moveUrl = "http://www.unity3d.com/webplayers/Movie/sample.ogg";//视频下载路径

string filePath = string.Empty; //用于存放本地文件的路径

MovieTexture mt;//视频文理

AudioSource aud;//声音组件

void Start () {

//mt = new MovieTexture();

aud = GetComponent<AudioSource>();

filePath =Application.dataPath + "/Resources/myMovie.ogg";

button.onClick.RemoveAllListeners();

button.onClick.AddListener(StartDownLoadAction);

}

//点击开始下载的时间

//如果在本地就直接播放,否则下载

public void StartDownLoadAction() {

//判断视频问价是否存在在本地,在本地的时候则进行播放,不在的时候进行下载

bool isExisits=File.Exists(filePath);

if (isExisits)

{

//播放

StartCoroutine("PlayMovie");

}

else {

//下载

button.interactable = false;

StartCoroutine("DownLoadMovie");

}

}

IEnumerator PlayMovie() {

WWW www = new WWW("file://" + Application.dataPath + "/Resources/myMovie.ogg");

yield return www;

while (!www.GetMovieTexture().isReadyToPlay)

{

yield return null;

}

mt = www.GetMovieTexture();

print(mt.name + "-----------------");

rawImg.texture = mt;

aud.clip = mt.audioClip;

mt.loop = true;

mt.Play();

aud.Play();

}

IEnumerator DownLoadMovie()

{

WWW www = new WWW(moveUrl);

while (!www.isDone) {

slider.value= www.progress;

yield return null;

}

//写入本地。通过File.WriteAllBytes将读取到的文件写入到本地

File.WriteAllBytes(filePath, www.bytes);

button.interactable = true;//恢复按钮的交互功能

UnityEditor.AssetDatabase.Refresh();//刷新文件夹

StartCoroutine("PlayMovie");//开启播放的协程

}

关于Unity的协程的更多相关文章

  1. [Unity菜鸟] 协程Coroutine

    1.协程,即协作式程序,其思想是,一系列互相依赖的协程间依次使用CPU,每次只有一个协程工作,而其他协程处于休眠状态. unity中StartCoroutine()就是协程,协程实际上是在一个线程中, ...

  2. C#神器 委托 + Unity神器 协程

    作为源生的C#程序员,可能已经非常了解委托(delegate).行动(Action)以及C#的事件了,不过作为一个半道转C#的程序员而言,这些东西可能还是有些陌生的,虽然委托并非是C#独创,亦非是首创 ...

  3. Unity使用协程技术制作倒计时器

    先上效果图 图片资源来自http://www.51miz.com/ 1.素材准备 在http://www.51miz.com/搜索png格式的数字图片,用Unity自带的图集制作工具,进行分割.Con ...

  4. 关于Unity中协程、多线程、线程锁、www网络类的使用

    协程 我们要下载一张图片,加载一个资源,这个时候一定不是一下子就加载好的,或者说我们不一定要等它下载好了才进行其他操作,如果那样的话我就就卡在了下载图片那个地方,傻住了.我们希望我们只要一启动加载的命 ...

  5. Unity在协程(Coroutines)内开启线程(Threading )

    孙广东  2017.6.13 http://blog.csdn.NET/u010019717 为什么要在协程中开启线程, 因为很多时候我们是需要线程执行完成后回到主线程的.然后主线程在继续执行后续的操 ...

  6. 【Unity】协程Coroutine及Yield常见用法

    最近学习协程Coroutine,参考了别人的文章和视频教程,感觉协程用法还是相当灵活巧妙的,在此简单总结,方便自己以后回顾.Yield关键字的语意可以理解为“暂停”. 首先是yield return的 ...

  7. Unity在协程内部停止协程自身后代码执行问题

    当在协程内部停止自身后,后面的代码块还会继续执行,直到遇到yield语句才会终止. 经测试:停止协程,意味着就是停止yield,所以在停止协程后,yield之后的语句也就不会执行了. 代码如下: us ...

  8. 发现一个小坑的地方,unity的协程,想要停止,必须以字符串启动

    今天想要停止一个协成,发现调用 StopCoroutine(ShowDebug()); 竟然不管用,后来看了文档才知道,原来想要停止协成,必须用字符启动协程 StartCoroutine(" ...

  9. unity 之协程返回值

    yield return null; // 下一帧再执行后续代码yield return 6;//(任意数字) 下一帧再执行后续代码yield break; //直接结束该协程的后续操作yield r ...

随机推荐

  1. MSQL的基准测试

    Mysql基准测试 基准测试 直接.简单.易于比较,用于评估服务器的处理能力 压力测试 对真实的月数据进行测试,获得真是系统所能承受的压力 基准测试的目的 1.建立MySQL服务器的性能基准线 2.模 ...

  2. 网络基础Cisco路由交换四

    NAT及静态转换 概述(NAT:网络地址转化) 作用: 通过将内部网络的私有ip地址翻译成全球唯一的公网ip地址, 使内部网络可以连接到互联网等外部网络上. NATA的特性 优点: 节省公有合法ip地 ...

  3. 【Unity3D】Unity3D 摄像机带透明截图

    转载请注明出处:http://www.cnblogs.com/shamoyuu/p/CropCamera.html ↓↓↓下面的废话可以不看↓↓↓ 最近处理了一批我的游戏的图标,步骤特别繁琐, 需要先 ...

  4. 玩转FFmpeg的7个小技巧

    FFmpeg堪称音频和视频应用程序的瑞士军刀,提供了丰富的选项和灵活性.很多时候用户为了看视频和听音乐都安装了ffmeg.更多关于ffmeg的详细介绍:here,可以通过ffmpeg -formats ...

  5. windows 7蓝屏解决办法

    1.通过工具打开出现蓝屏原因的dmp文件,找到原因 Unable to load image \SystemRoot\system32\ntkrnlpa.exe, Win32 error 0n2 2. ...

  6. Java中private、protected和public作用域的异同

    Java中private.protected和public作用域的异同 说明:(1)private的作用范围为当前类,protected的作用范围哦不能超过其他包: (2)区别不同的作用域的不同作用范 ...

  7. WIN7 嵌入式系统安装教程 Windows Embedded Standard 2011 安装

    轻松构建你的第一个 Windows Embedded Standard 2011 镜像.通过本文你可以快速掌握如何使用Windows Embedded Standard 2011 CTP1 来构建一个 ...

  8. echarts中的option.legend.data has not been defined.

    1.错误描述 2.错误原因 var map = function(mapData){ require( [ 'echarts', 'echarts/chart/map' ], function (ec ...

  9. 把连续动态bmp转换为avi

    把动态bmp24转换为avi BYTE tmp_buf[1024*768*4]; //生成avi void BMPtoAVI(CString szAVIName, CString strBmpDir) ...

  10. meta的各种参数

    <!DOCTYPE html> <!-- 使用 HTML5 doctype,不区分大小写 --> <html lang="zh-cmn-Hans"&g ...