关于Unity的协程

BXLH 2018-03-22 原文

关于Unity的协程

 协程

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

}

发表于 2018-03-22 12:13 百晓灵狐 阅读() 评论() 编辑 收藏

 

版权声明:本文为BXLH原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/BXLH/p/8622778.html

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

  1. 线程、进程、协程

    进程是资源分配单位,系统会分配内存,屏幕,窗口。线程是进程中真正执行的东西。  python中的thread模 […]...

  2. Python协程

    目录GIL与普通互斥锁区别验证多线程作用死锁现象信号量(了解)和event事件(了解)进程池与线程池(重点)协程基于协程实现TCP服务端并发GIL与普通互斥锁区别验证GIL的存在from threading import Thread...

  3. Python之yield语法

    生成器与yield 函数使用yield关键字可以定义生成器对象。生成器是一个函数。它生成一个值的序列,以便在迭 […]...

  4. python多进程与协程

    1、进程的概念 什么是进程—>CPU在同一时刻只能处理一个任务,只是因为cpu执行速度很快。 cpu在各 […]...

  5. Openresty Lua协程调度机制

    OR最大的特点就是,将Lua协程与Nginx事件驱动模型及非阻塞I/O结合起来。使用户可以在handler中使 […]...

  6. python协程

    import timedef func(): print('i love dawn') time.sleep(3)#让当前线程处于阻塞状态,cpu暂时不为此工作 print('i love dawn true')if _...

  7. 协程

      有趣的漫画对话 先来欣赏一段有趣的漫画对话哦              ————— 第二天 —————   […]...

  8. python协程asyncio的个人理解

    目录协程与任务基本语法协程的声明和运行可等待对象运行asyncio程序创建任务休眠机制解析运行的流程图示协程与任务python语境中,协程 coroutine 的概念有两个:协程函数、协程对象,协程对象由协程函数创建得到(类似于类实例...

随机推荐

  1. JVM性能调优(3) —— 内存分配和垃圾回收调优

    介绍了如何一步步估算JVM内存运转模型,然后针对性的对YoungGC、FullGC调优,分析了OOM内存溢出问 […]...

  2. GooseFS助力大数据业务数倍提升计算能力

    前言 GooseFS是由腾讯云推出的一款分布式缓存方案,主要针对包括需要缓存加速的数据湖业务场景,提供基于对象 […]...

  3. Taurus.MVC 2.3 开源发布:增强属性Require验证功能,自带WebAPI文档生成功能

    背景: 上周,把 Taurus.MVC 在 Linux (CentOS7) 上部署任务完成后。 也不知怎么的, […]...

  4. C语言实现单链表,并完成链表常用API函数

    C语言实现单链表,并完成链表常用API函数:   1.链表增、删、改、查。   2.打印链表、反转打印、打印环 […]...

  5. 架构之:REST和HATEOAS

    目录 简介 HATEOAS简介 HATEOAS的格式 HATEOAS的Spring支持 总结 简介 我们知道R […]...

  6. Android开发之漫漫长途 IX——彻底掌握Binder

    该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编 […]...

  7. 改变滚动条的原始样式: chrome 可以改变, IE只能变相关颜色,firfox好像也不好改。最好是自己写一个或是用插件

    相关作者链接地址: https://www.lyblog.net/detail/314.html 问题: 1. […]...

  8. (欧拉图 并查集 图论) 2922. kotori和旅游

    【题目描述】 kotori有一个目标,要旅游遍全日本。 可惜日本太大了,她没有足够的经费。于是kotori计划 […]...

展开目录

目录导航