协程

  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");//开启播放的协程

}

转载于:https://www.cnblogs.com/BXLH/p/8622778.html

关于Unity的协程相关推荐

  1. unity协程_[C#进阶]C#实现类似Unity的协程

    使用过Unity的同学一定知道,Unity提供了一套协程机制,简直不要太好用.但是这个协程依赖于Unity引擎,离开Unity就无法使用.那有没有办法实现不依赖Unity的协程呢?答案是当然阔以. 所 ...

  2. Unity的协程详解

    一.协程的定义 协程,即为协同程序. Unity中的协程由协程函数和协程调度器两部分构成.协程函数使用的是C#的迭代器, 协程调度器则利用了MonoBehaviour中的生命周期函数来实现. 协程函数 ...

  3. Unity通过协程实现回合制战斗

    Unity通过协程实现回合制战斗(一.1v1部分) - 技术专栏 - Unity官方开发者社区本文详细地阐述了如何实现回合制战斗,从配置文件到战斗数据,最后再通过协程实现战斗 - Unity技术专栏是 ...

  4. Unity中协程与线程的区别

    本文转载自:https://blog.csdn.net/qq_25122429/article/details/80481443 协同程序(coroutine)与多线程情况下的线程比较类似:有自己的堆 ...

  5. unity update 协程_Unity 协程的原理

    Unity 协程的原理 发布时间:2019-06-13 18:45, 浏览次数:1118 , 标签: Unity 协程不是多线程,协程还是在主线程里面(注:在Unity中非主线程是不可以访问Unity ...

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

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

  7. Unity 的协程的原理

    Unity是一款非常强大的游戏引擎,它支持多种编程语言,其中最常用的语言是C#.在Unity中,协程是一种非常强大的功能,它可以让我们在游戏中实现各种各样的效果.本文将详细介绍Unity协程的原理,并 ...

  8. Unity 模拟协程实现计时器功能

    众所周知,在Unity里面开启协程会有消耗,有时候就算我们只需要用到一个简单的计时器,必须开一个协程或者自己写一个计时器.这里提供了一个通用的计时器类,里面还实现了内存池管理,使用完的计时器回收备用. ...

  9. Unity中协程的yield return

    记录Unity中对于协程常用的一些操作 不管是对于网络请求或加载资源时以及一些相对来说比较耗费时间的运算时,我们不希望会全部写在Update中来占用大量主线程的资源. 协程 : IEnumerator ...

  10. Unity中协程(IEnumerator)的使用方法介绍

    在Unity中,一般的方法都是顺序执行的,一般的方法也都是在一帧中执行完毕的,当我们所写的方法需要耗费一定时间时,便会出现帧率下降,画面卡顿的现象.当我们调用一个方法想要让一个物体缓慢消失时,除了在U ...

最新文章

  1. SqlServer2000 类似sqlserver2005的 rownumber() 函数
  2. 【正一专栏】为何我们要侥幸而又苟且地活着
  3. 第三章 改进神经网络的学习方式(上)
  4. 5、用枚举值表示状态、选项、状态码
  5. spring cloud利用feign和sentinel进行内部或外部远程调用
  6. mybatis查询mysql数据库很慢_mybatis查询大量数据库
  7. Echarts定制一个地图
  8. linux下数学公式的编辑器,Linux下的公式编辑器——libreoffice math 使用快速入门
  9. Oracle P6培训系列:06创建项目日历
  10. 看完这篇“史密斯圆图”告别懵逼射频!
  11. 重建同义词+oracle,Oracle中创建,删除同义词 Synonym
  12. 公司内部分享【富有成效的每日站会】总结
  13. oracle 按时间每五分钟分割,Oracle 5分钟或30分钟分割方法
  14. 马云给公司年轻员工的一封信
  15. 手机通过笔记本上网~
  16. 网站运营中活动组织的三项注意
  17. cisco路由器启动过程
  18. 【科创人】快狗打车CTO沈剑:努力不会背叛,承担社会责任的企业胜算高一点点
  19. 使用python抓取并分析数据—链家网(requests+BeautifulSoup)(转)
  20. 笔记本WIN7建立共享wifi的简单方法

热门文章

  1. c#中拖动图片的例子
  2. leetcode 155. 最小栈
  3. 计算机视觉领域最全汇总(第2部分)
  4. vc6.0报delete and rebuild Error executing link.exe.错误
  5. python自动补全库_叼炸天的库! 自动补全 Python 代码,能节省 60% 敲码时间
  6. python中哪个函数能生成集合_神奇的python系列11:函数之生成器,列表推导式
  7. 007_支持序列化空值
  8. android 打卡app,日常小打卡app
  9. 小米手环4怎么使用_小米手环4/5 NFC添加加密门禁
  10. html手机和电脑显示内容不同,同一个网站,手机端跟电脑端显示不同是怎么实现的?...