协程

  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. Ajax检测用户名是否已经注册

    程序功能 当用户名输入完成(即用户名输入框失去焦点),利用Ajax检测用户名是否已经注册! 实现过程 利用Ajax向CheckUserServlet发送请求,判断该用户名是否可用.这里只是为了演示Aj ...

  2. java网络编程(1)

    太久没有用java做一些东西了,搞太多的协议框架,基本的东西好像快忘记了~每天抽出一点时间出来,来好好温习下基础,顺便记录下来,以后还忘记可以回来看看==.首先从网络编程开始吧==.这玩意太久没有用了 ...

  3. SpringBoot+gradle+idea实现热部署和热加载

    前言 因为之前使用myeclipes的同学就知道,在使用myeclipes的时候,java文件或者jsp文件写完之后会被直接热加载到部署的容器中,从而在开发的时候,不同经常去重启项目,从而达到了增加开 ...

  4. (!(~+[])+{})[--[~+""][+[]]*[~+[]] + ~~!+[]]+({}+[])[[~!+[]]*~+[]]一行js代码的原理分析

    再说这行代码之前,咱们先来预习一下知识. 我们都知道计算机操作系统分为32位或者64位.那么这个32位或64位指的是什么意思呢?其实,要想解释它并不难,其实这就是计算机处理数据的机制,32位表示计算机 ...

  5. List,Set,Map

    1.Collection 和 Map 的区别 容器内每个为之所存储的元素个数不同.Collection类型者,每个位置只有一个元素.List,SetMap类型者,持有 key-value pair,像 ...

  6. 【Unity3D】Unity3D开发《我的世界》之二、创建一个立方体

    转载请注明出处:http://www.cnblogs.com/shamoyuu/p/unity_minecraft_02.html 这一篇的内容比较简单,因为所有理论内容都在上一篇中讲到了.但有两点需 ...

  7. Ubuntu 11.04 NFS 配置

    安装 NFS 相关组件 sudo apt-get install nfs-kernel-server 增加 NFS 目录 sudo gedit /etc/exports #在文件中添加如下内容 /va ...

  8. 小说接入UC浏览器内核技术对话(一)

    质辛@灿岩 质辛跟我们说一下那个删除文件的逻辑吧质辛@灿岩  应该不是删除cache下所有文件吧?质辛@智鹰  提供一下我们的临时文件完整路径给 灿岩吧质辛@智鹰  是负责我们ucsdk的 技术对接灿 ...

  9. 织梦dedecms列表序号从0到1开始的办法 autoindex,itemindex标签

    自增1 arclist            标签下使用 [field:global.autoindex/] 默认从1开始 channel         标签下使用 [field:global.au ...

  10. JDBC异常之数据库表不存在

    JDBC异常之数据库表不存在 1.具体错误如下: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:Table 'YHD.t_yhd_ ...