日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

关于Unity的协程

發布時間:2025/4/16 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于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");//開啟播放的協程

    }

    轉載于:https://www.cnblogs.com/BXLH/p/8622778.html

    《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

    總結

    以上是生活随笔為你收集整理的关于Unity的协程的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。