色综合老司机第九色激情 _中文字幕日韩av资源站_国产+人+亚洲_久久久精品影院_久久久视频免费观看_欧美激情亚洲自拍_亚洲成av人片在线观看香蕉_热草久综合在线_欧美极品第一页_2020国产精品自拍

千鋒教育-做有情懷、有良心、有品質(zhì)的職業(yè)教育機構(gòu)

手機站
千鋒教育

千鋒學習站 | 隨時隨地免費學

千鋒教育

掃一掃進入千鋒手機站

領(lǐng)取全套視頻
千鋒教育

關(guān)注千鋒學習站小程序
隨時隨地免費學習課程

當前位置:首頁  >  技術(shù)干貨  > 一節(jié)課徹底掌握Unity中協(xié)程的用法

一節(jié)課徹底掌握Unity中協(xié)程的用法

來源:千鋒教育
發(fā)布人:syq
時間: 2022-06-08 13:57:00 1654667820

  文章目錄

  一、前言

  二、學習使用協(xié)程

  1.首先定義多個定時器,去實現(xiàn)游戲中的邏輯...

  2.案例演示

  3.開啟和終止協(xié)程

  4.協(xié)程的返回值

  5.案例應用

  三、總結(jié)

  前言

  協(xié)程在Unity開發(fā)中非常重要,但注意:協(xié)程跟多線程沒有任何關(guān)系,不要將兩者混為一談,接下來就跟大家分享一下我對協(xié)程的理解及用法!

Unity中協(xié)程的用法

  一、協(xié)程是什么?

  協(xié)程是一段在主線程中執(zhí)行的代碼邏輯,協(xié)程不是多線程。Unity的協(xié)程在每幀結(jié)束后去檢測yiled的條件是否滿足。

  二、學習使用協(xié)程

  1.首先定義多個定時器,去實現(xiàn)游戲中的邏輯...

  代碼如下:

  float timer1 = 3f;

  float timer2 = 5f;

  float timer3 = 8f;

  void Update()

    {

        timer1 -= Time.deltaTime;

        if (timer1 <= 0)

        {

            Debug.Log("3s過后...");

            timer1 = 3f;

        }

    }

  相信大家都寫過類似代碼,這種代碼如果項目中需要多個定時器時,會顯得非常臃腫,并且我們經(jīng)常忘記做一件事情,比如忘記充值定時器...

  我們都學過循環(huán),for循環(huán)中是將變量i定義為局部變量,封裝成一個代碼塊,那我們是否可以將定時器也封裝成一個代碼塊呢?如果可以的話,那么代碼應該是這樣的:

 for (float timer = 3; timer >= 0; timer -= Time.deltaTime)

        {

            

        }

  現(xiàn)在每一個計時器變量都成為for循環(huán)的一部分了,這看上去好多了,而且我不需要去單獨設置每一個迭代變量。 但是這段代碼放在哪里去執(zhí)行呢?start?update?顯然都不可以,所以恰好協(xié)程可以做到這一點。我們回顧一下協(xié)程的概念:

  為了能在連續(xù)的多幀中(在這個例子中,3秒鐘等同于很多幀)調(diào)用該方法,Unity必須通過某種方式來存儲這個方法的狀態(tài),

  -這是通過IEnumerator 中使用yield return語句得到的返回值,當你“yield”一個方法時,你相當于說了,“現(xiàn)在暫停這個方法,

  -然后在下一幀中從這里繼續(xù)執(zhí)行!”。

  注意:用0或者null來yield的意思是告訴協(xié)程等待下一幀,直到繼續(xù)執(zhí)行為止。

  當然,同樣的你可以繼續(xù)yield其他協(xié)程,我會在下一個教程中講到這些。

  代碼如下:

    IEnumerator CountDown(){

        for (float timer = 3; timer >= 0; timer -= Time.deltaTime)

        {

            yield return 0;//現(xiàn)在停止這個方法,然后在下一幀中從這里繼續(xù)執(zhí)行!

        }

        Debug.Log("3s以后...");

    }

  2.案例演示

  /*

  * 接下來通過實例

  * 1.實現(xiàn)打印5次--我要學游戲開發(fā)!

  * 2.實現(xiàn)將這5次輸出分到每一幀里去實現(xiàn):每幀打印1次,共打印5次!

  * 3.每一幀輸出“我要學游戲開發(fā)!”,無限循環(huán)。。。

  通過在一個while循環(huán)中使用yield,你可以得到一個無限循環(huán)的協(xié)程,這幾乎就跟一個Update()循環(huán)等同。。。

  */

  2.代碼如下:

  IEnumerator SayHello5Times()

    {

        for (int i = 0; i < 5; i++)

        {

            Debug.Log("我要學游戲開發(fā)!");

            yield return 0;

        }

  3.類似Update,代碼如下:

 IEnumerator SayHello5Times()

 {

      while (true)

        {

            //1.輸出結(jié)果

            Debug.Log("我要學游戲開發(fā)!");

            //2.等待下一幀

            yield return 0;

        }

  //1.輸出結(jié)果

  Debug.Log("我要學游戲開發(fā)!");

  //2.等待下一幀

  //3. 這里永遠沒有機會執(zhí)行

  }

  但是跟Update()不一樣的是,你可以在協(xié)程中做一些更有趣的事:

  接下來做一個定時器 每隔幾秒完成某一件事

    IEnumerator CountSeconds()

    {

        int seconds = 0;

        while (true)

        {

            for (float timer = 0; timer < 1; timer += Time.deltaTime)

            {

                yield return 0;

            }

            seconds++;

            Debug.Log("自協(xié)程啟動以來已經(jīng)過了"+ seconds+"秒");

        }

    }

  這個方法突出了協(xié)程一個非??岬牡胤剑悍椒ǖ臓顟B(tài)被存儲了,這使得方法中定義的這些變量都會保存它們的值,即使是在不同的幀中。還記得這個教程開始時那些煩人的計時器變量嗎?通過協(xié)程,我們再也不需要擔心它們了,只需要把變量直接放到方法里面!實際還有更優(yōu)雅的實現(xiàn)方式!稍后會跟大家講到。

  3.開啟和終止協(xié)程

  之前,我們已經(jīng)學過了通過 StartCoroutine()方法來開始一個協(xié)程。

  如果我們想要終止所有的協(xié)程,可以通過StopAllCoroutines()方法來實現(xiàn),

  注意,這只會終止在調(diào)用該方法的對象中開始的協(xié)程,對于其他的MonoBehavior類中運行的協(xié)程不起作用。

  那我們怎么終止其中的一個協(xié)程呢?在這個例子里,這是不能的,如果你想要終止某一個特定的協(xié)程,

  那么你必須得在開始協(xié)程的時候?qū)⑺姆椒鳛樽址拖襁@樣:

  1、以字符串開啟/關(guān)閉,缺點:只能有一個參數(shù)

        StartCoroutine("FirstTimer");

        StopCoroutine("FirstTimer”);

  2、開啟帶有參數(shù)的協(xié)程的兩種方式:

        StartCoroutine(Sayhi("hi")) 

        StartCoroutine("Sayhi","hi")

  3、如何終止多個參數(shù)的協(xié)程呢?接受返回值

    Coroutine stopCor_2 = StartCoroutine(Cor_2());

    StopCoroutine(stopCor_2);

  4、StopAllCoroutines

  5、通知禁用或者銷毀方式

      gameObject.SetActive(false); 

      //通過銷毀游戲?qū)ο蠓绞胶徒猛Ч?/span>

      //Destroy(gameobject)

  4.協(xié)程的返回值

  協(xié)程一旦被開啟后 總是試圖將方法內(nèi)的代碼執(zhí)行完 之后停止

  1.在此之前,我們yield的時候總是用0(或者null),僅僅告訴程序在繼續(xù)執(zhí)行前等待下一幀。協(xié)程最強大的一個功能就是它們可以通過使用yield語句來相互嵌套。

  2.yield return new WaitForSeconds(n) 表示在n秒后執(zhí)行后面的代碼 但是會收到time.timescale 影響 ,如下代碼:

  //隔一定時間完成某件事

    IEnumerator SaySomeThings()

    {

        Debug.Log("協(xié)程開始執(zhí)行");

        yield return StartCoroutine(Wait(1.0f));

        Debug.Log("距離上一條消息已經(jīng)過去1秒了");

        yield return StartCoroutine(Wait(2.5f));

        Debug.Log("距離上一條消息已經(jīng)過去2.5秒了");

    }

  上述方法用了yield,但它并沒有用0或者null,而是用了Wait()來yield,這相當于是說,“不再繼續(xù)執(zhí)行本程序,直到Wait程序結(jié)束”。

  等待的方法還可以使用下面方式來實現(xiàn):

    IEnumerator Wait(float duration)

    {

        for (float timer = 0; timer < duration; timer += Time.deltaTime)

            yield return 0;

    }

  3.在協(xié)程內(nèi) 如果遇到y(tǒng)ield return StartCoroutine(test) 剩余的代碼將在子協(xié)程執(zhí)行完畢后才能繼續(xù)執(zhí)行

  4.如果遇到 yield return new WaitForFixedUpdate 表示剩余代碼將在FixedUpdate 執(zhí)行完畢后執(zhí)行

  5.如果遇到 yield return WWW 等待一個網(wǎng)絡請求完成后繼續(xù)向下執(zhí)行

  6.如果遇到 yield return gameObject; 表示在gameobj不為空時向下執(zhí)行

  5.案例應用

  控制對象行為的例子

  在最后一個例子中,我們就來看看協(xié)程如何像創(chuàng)建方便的計時器一樣來控制對象行為。協(xié)程不僅僅可以使用計數(shù)的時間來yield,它還能很巧妙地利用任何條件。將它與嵌套結(jié)合使用,你會得到控制游戲?qū)ο鬆顟B(tài)的最強大工具。運動到某一位置,對于下面這個簡單腳本組件,我們可以在Inspector面板中給targetPosition和moveSpeed變量賦值,程序運行的時候,該對象就會在協(xié)程的作用下,以我們給定的速度運動到給定的位置。

  代碼如下:

public Vector3 targetPosition;  

    public float moveSpeed;

    void Start1()

    {

        StartCoroutine(MoveToPosition(targetPosition));

    }

 

    IEnumerator MoveToPosition(Vector3 target)

    {

        while (transform.position != target)

        {

            transform.position = Vector3.MoveTowards(transform.position, target, moveSpeed * Time.deltaTime);

            yield return 0;

        }

    }

  這樣,這個程序并沒有通過一個計時器或者無限循環(huán),而是根據(jù)對象是否到達指定位置來yield。

  我們可以讓運動到某一位置的程序做更多,不僅僅是一個指定位置,我們還可以通過數(shù)組來給它賦值更多的位置,通過MoveToPosition() ,我們可以讓它在這些點之間持續(xù)運動。

  代碼如下:

 public Vector3[] path;  

 

    void Start2()

    {

        StartCoroutine(MoveOnPath(true));

    }

 

    IEnumerator MoveOnPath(bool loop)

    {

        do

        {

            foreach (var point in path)

                yield return StartCoroutine(MoveToPosition(point));

        }

        while (loop);

    }

  還可以加一個布爾變量,你可以控制在對象運動到最后一個點時是否要進行循環(huán)。

  課堂練習:嘗試讓物體在某個點停留3s

  如果把Wait()程序加進來,這樣就能讓我們的對象在某個點就可以選擇是否暫停下來,就像一個正在巡邏的AI守衛(wèi)一樣,并且這種實現(xiàn)方式看起來非常優(yōu)雅!

  三、總結(jié)

  l 多個協(xié)程可以同時運行,它們會根據(jù)各自的啟動順序來更新;

  l 協(xié)程可以嵌套任意多層(在這個例子中我們只嵌套了一層);

  l 如果你想讓多個腳本訪問一個協(xié)程,那么你可以定義靜態(tài)的協(xié)程;

  l 協(xié)程不是多線程(盡管它們看上去是這樣的),它們運行在同一線程中,跟普通的腳本一樣;

  l 如果你的程序需要進行大量的計算,那么可以考慮在一個隨時間進行的協(xié)程中處理它們;

  l IEnumerator類型的方法不能帶ref或者out型的參數(shù),但可以帶被傳遞的引用;

  l 協(xié)程有多種開啟和終止的方法,但是最好用哪種方式開啟,就是用哪種方式終止。

  更多關(guān)于“Unity”的問題,歡迎咨詢千鋒教育在線名師。千鋒教育多年辦學,課程大綱緊跟企業(yè)需求,更科學更嚴謹,每年培養(yǎng)泛IT人才近2萬人。不論你是零基礎還是想提升,都可以找到適合的班型,千鋒教育隨時歡迎你來試聽。

tags:
聲明:本站稿件版權(quán)均屬千鋒教育所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
10年以上業(yè)內(nèi)強師集結(jié),手把手帶你蛻變精英
請您保持通訊暢通,專屬學習老師24小時內(nèi)將與您1V1溝通
免費領(lǐng)取
今日已有369人領(lǐng)取成功
劉同學 138****2860 剛剛成功領(lǐng)取
王同學 131****2015 剛剛成功領(lǐng)取
張同學 133****4652 剛剛成功領(lǐng)取
李同學 135****8607 剛剛成功領(lǐng)取
楊同學 132****5667 剛剛成功領(lǐng)取
岳同學 134****6652 剛剛成功領(lǐng)取
梁同學 157****2950 剛剛成功領(lǐng)取
劉同學 189****1015 剛剛成功領(lǐng)取
張同學 155****4678 剛剛成功領(lǐng)取
鄒同學 139****2907 剛剛成功領(lǐng)取
董同學 138****2867 剛剛成功領(lǐng)取
周同學 136****3602 剛剛成功領(lǐng)取
相關(guān)推薦HOT
色综合老司机第九色激情 _中文字幕日韩av资源站_国产+人+亚洲_久久久精品影院_久久久视频免费观看_欧美激情亚洲自拍_亚洲成av人片在线观看香蕉_热草久综合在线_欧美极品第一页_2020国产精品自拍
中文av一区特黄| 91亚洲精品久久久蜜桃网站| 国产欧美一区二区精品性| 亚洲精选视频免费看| 91麻豆免费看片| 夜夜精品视频一区二区 | 在线看国产日韩| 亚洲一区免费观看| 亚洲国产高清不卡| 精品视频1区2区| 美女mm1313爽爽久久久蜜臀| 亚洲精品福利视频网站| 国产精品久久久久久久蜜臀| 欧美乱妇20p| 国产大陆精品国产| 亚洲伊人伊色伊影伊综合网| 日韩欧美在线123| 国产黄色精品视频| 亚洲成人一二三| 久久综合av免费| 国产suv精品一区二区883| 老司机精品视频线观看86| 日韩中文字幕一区二区三区| 亚洲va韩国va欧美va精品| 亚洲综合一区在线| 亚洲高清免费在线| 欧美日韩国产高清一区| 亚洲欧洲色图综合| 18欧美乱大交hd1984| 中文字幕一区二区三区av| 中文字幕亚洲成人| 亚洲人成网站色在线观看| 亚洲综合在线免费观看| 精品亚洲欧美一区| 91视频在线观看| 精品国产露脸精彩对白 | 国产精品一区二区91| 粉嫩aⅴ一区二区三区四区 | 粉嫩一区二区三区性色av| 成人免费看黄yyy456| 欧美伊人久久大香线蕉综合69 | 五月激情综合网| 狠狠网亚洲精品| aaa欧美日韩| 欧美一区二区三区四区视频| 国产喷白浆一区二区三区| 国产精品伦理在线| 亚洲小说春色综合另类电影| 日本视频免费一区| 色综合夜色一区| 精品久久久久一区二区国产| 国产精品女同一区二区三区| 亚洲欧美激情小说另类| 国产经典欧美精品| 日韩欧美在线123| 亚洲一区在线播放| 色香蕉久久蜜桃| 亚洲图片另类小说| 国产麻豆91精品| 26uuu国产一区二区三区| 免费成人在线网站| 欧美一级淫片007| 久久精品国产精品亚洲综合| 日韩一区二区在线看| 久久成人av少妇免费| 久久久精品tv| 99热精品一区二区| 老司机免费视频一区二区三区| 国产农村妇女毛片精品久久麻豆 | 高清国产一区二区三区| 亚洲一区欧美一区| 欧美日韩国产经典色站一区二区三区| 亚洲美腿欧美偷拍| 日韩免费高清电影| 色婷婷综合久久久中文字幕| 久久91精品久久久久久秒播| 久久久亚洲精品一区二区三区| 99vv1com这只有精品| 免费视频一区二区| 亚洲在线观看免费视频| 久久精品综合网| 欧美视频在线一区二区三区 | 国产精品久久精品日日| 在线成人小视频| 成人一区在线观看| 成人精品国产一区二区4080| 老司机免费视频一区二区三区| 亚洲欧美偷拍三级| 中文字幕永久在线不卡| 亚洲女人的天堂| 日本vs亚洲vs韩国一区三区| 欧美日韩精品三区| 91丝袜美女网| 欧美精品777| 国产精品高清亚洲| 日本va欧美va瓶| 成人激情动漫在线观看| 91看片淫黄大片一级在线观看| 在线观看亚洲成人| 欧美顶级少妇做爰| 一区二区三区av电影| 2014亚洲片线观看视频免费| 九九视频精品免费| 亚洲自拍偷拍麻豆| 亚洲一级二级三级| 高清不卡在线观看av| 成人av一区二区三区| 欧美在线小视频| 久久久亚洲精华液精华液精华液| 精品国产免费一区二区三区香蕉 | 亚洲国产精品精华液ab| 国产精品电影一区二区| 性久久久久久久久久久久| 99精品视频一区二区| 欧美色大人视频| 国产日韩欧美精品一区| 欧美aaa在线| 国产一区二区三区精品视频| 欧美美女激情18p| 亚洲视频一区二区在线观看| 国产一区二区按摩在线观看| 欧美日韩国产综合久久| 亚洲永久免费视频| 不卡欧美aaaaa| 国产欧美日韩一区二区三区在线观看| 精品国产乱码久久久久久闺蜜 | 色综合夜色一区| 91精品国产综合久久久蜜臀粉嫩 | 国产欧美日韩久久| 亚洲品质自拍视频| 成人av电影免费在线播放| 日本一区二区综合亚洲| 成人欧美一区二区三区黑人麻豆| 国产精品高潮久久久久无| 风流少妇一区二区| 精品欧美一区二区三区精品久久| 性做久久久久久久免费看| 大桥未久av一区二区三区中文| 欧美mv日韩mv国产网站| 国产伦精品一区二区三区免费| 精品国产髙清在线看国产毛片 | 色系网站成人免费| 亚洲高清免费在线| 欧美性大战久久久久久久蜜臀 | 成人深夜视频在线观看| 1024国产精品| 久久久久九九视频| 欧美高清视频在线高清观看mv色露露十八| 色婷婷久久99综合精品jk白丝| 亚洲欧美日韩国产成人精品影院 | 黄色日韩网站视频| 日韩理论在线观看| 亚洲情趣在线观看| 亚洲一区二区偷拍精品| 看片的网站亚洲| 91精品国产一区二区三区香蕉| 男女男精品网站| 亚洲国产一区二区a毛片| 精品国产伦一区二区三区观看方式| 在线影院国内精品| 在线观看日韩电影| av午夜精品一区二区三区| 亚洲777理论| 日产国产欧美视频一区精品| 日韩欧美电影一二三| 日韩美女视频在线| 99久久er热在这里只有精品15| 美女mm1313爽爽久久久蜜臀| 日本不卡一区二区三区高清视频| 日韩主播视频在线| 久久er精品视频| 成人丝袜18视频在线观看| 国产精品对白交换视频| 国产精品日日摸夜夜摸av| 中文字幕av一区二区三区高 | 亚洲三级在线免费观看| 一区二区三区视频在线看| 欧美激情一区二区三区不卡| 久久久www成人免费无遮挡大片| 26uuu欧美日本| 天堂av在线一区| 蜜臀久久99精品久久久久久9| 福利一区二区在线| 处破女av一区二区| 国产欧美日韩不卡免费| 亚洲二区在线视频| 麻豆免费看一区二区三区| 欧美影院一区二区三区| 国产精品不卡视频| 成人性生交大片| 亚洲精品久久久蜜桃| 成人精品高清在线| 2021久久国产精品不只是精品| 亚洲va韩国va欧美va精品| 欧美乱妇20p| 久久精品99久久久| 久久久精品欧美丰满| 亚洲欧洲日本在线| 日韩一区二区在线观看视频| 综合av第一页|