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

}

猜你喜欢

转载自www.cnblogs.com/BXLH/p/8622778.html