关于Unity的协程
协程
- 认识协程
//协程不是多线程:是一段在主程序之外执行的代码
//协程不受生命周影响
//作用:能够口直代码在特定的时间执行。
//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();当前脚本对象开启的所有协程
}
- 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的文理
}
- 用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();//声音播放
}
- 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("");
}
- 下载网上的资源,显示进度条,并且当本地存在视频时播放,不存在时下载
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的协程的更多相关文章
- [Unity菜鸟] 协程Coroutine
1.协程,即协作式程序,其思想是,一系列互相依赖的协程间依次使用CPU,每次只有一个协程工作,而其他协程处于休眠状态. unity中StartCoroutine()就是协程,协程实际上是在一个线程中, ...
- C#神器 委托 + Unity神器 协程
作为源生的C#程序员,可能已经非常了解委托(delegate).行动(Action)以及C#的事件了,不过作为一个半道转C#的程序员而言,这些东西可能还是有些陌生的,虽然委托并非是C#独创,亦非是首创 ...
- Unity使用协程技术制作倒计时器
先上效果图 图片资源来自http://www.51miz.com/ 1.素材准备 在http://www.51miz.com/搜索png格式的数字图片,用Unity自带的图集制作工具,进行分割.Con ...
- 关于Unity中协程、多线程、线程锁、www网络类的使用
协程 我们要下载一张图片,加载一个资源,这个时候一定不是一下子就加载好的,或者说我们不一定要等它下载好了才进行其他操作,如果那样的话我就就卡在了下载图片那个地方,傻住了.我们希望我们只要一启动加载的命 ...
- Unity在协程(Coroutines)内开启线程(Threading )
孙广东 2017.6.13 http://blog.csdn.NET/u010019717 为什么要在协程中开启线程, 因为很多时候我们是需要线程执行完成后回到主线程的.然后主线程在继续执行后续的操 ...
- 【Unity】协程Coroutine及Yield常见用法
最近学习协程Coroutine,参考了别人的文章和视频教程,感觉协程用法还是相当灵活巧妙的,在此简单总结,方便自己以后回顾.Yield关键字的语意可以理解为“暂停”. 首先是yield return的 ...
- Unity在协程内部停止协程自身后代码执行问题
当在协程内部停止自身后,后面的代码块还会继续执行,直到遇到yield语句才会终止. 经测试:停止协程,意味着就是停止yield,所以在停止协程后,yield之后的语句也就不会执行了. 代码如下: us ...
- 发现一个小坑的地方,unity的协程,想要停止,必须以字符串启动
今天想要停止一个协成,发现调用 StopCoroutine(ShowDebug()); 竟然不管用,后来看了文档才知道,原来想要停止协成,必须用字符启动协程 StartCoroutine(" ...
- unity 之协程返回值
yield return null; // 下一帧再执行后续代码yield return 6;//(任意数字) 下一帧再执行后续代码yield break; //直接结束该协程的后续操作yield r ...
随机推荐
- Codeforces446C - DZY Loves Fibonacci Numbers
Portal Description 给出一个\(n(n\leq3\times10^5)\)个数的序列,进行\(m(m\leq3\times10^5)\)次操作,操作有两种: 给区间\([L,R]\) ...
- Android虚拟机安装
由于虫师那边的源估计到期了,我又找了一波. 打开SDK Manager.exe, 就在安卓目录下. 点击Tools--Options进入配置页面 mirrors.neusoft.edu.cn 配置如下 ...
- 重装Win10系统的非常简单的操作教程
这是回到学校的第二天,准备搞一份实习证明,然而宿舍宽带停了,于是我来到了社团办公室,打开了其中一台电脑. 各位师弟师妹...你们也太厉害,把电脑折腾成这样...电脑装了各种各样的工具, Adobe P ...
- Spring初始化ApplicationContext为null
1. ApplicationContextAware初始化 通过它Spring容器会自动把上下文环境对象调用ApplicationContextAware接口中的setApplicationConte ...
- Jlink 烧写Uboot
第一章 Hi3531_SDK_Vx.x.x.x版本升级操作说明 如果您是首次安装本SDK,请直接参看第2章. 第二章首次安装SDK 1.Hi3531 SDK包位置 在"Hi3531_V100 ...
- python3.4 UnicodeDecodeError: 'gbk' codec can't decode byte 0xff in position
python3.4 UnicodeDecodeError: 'gbk' codec can't decode byte 0xff in position 实用python的时候 打开一个csv的文件出 ...
- 【mongodb系统学习之十一】mongodb删除数据
十一.mongodb删除数据: 1).删除全部文档:remove,语法db.collectionName.remove({}):小括号里边必须要有条件,否则不成功:如果只是一个空的{},则会删除集合内 ...
- zTree实现更新根节点中第i个节点的名称
zTree实现更新根节点中第i个节点的名称 1.实现源码 <!DOCTYPE html> <html> <head> <title>zTree实现基本树 ...
- ASP.NET CORE的Code Fist后Models更改了怎么办?
上次我写到MVC的code fist后,自动生成数据库并自动生成web页面了 点击打开链接 那么随着项目需求的逐步明确,model变化了怎么办呢?其实和上次一样的,有两条关键的语句要记住 Add-Mi ...
- iOS - UIView 动画
1.UIView 动画 核心动画 和 UIView 动画 的区别: 核心动画一切都是假象,并不会真实的改变图层的属性值,如果以后做动画的时候,不需要与用户交互,通常用核心动画(转场). UIView ...