关于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();當前腳本對象開啟的所有協程
}
????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的文理
}
?
????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();//聲音播放
}
????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的协程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Unity UI代码自动生成
- 下一篇: 183. Customers Who N