Unity C# | 協程(Coroutine)的概念、使用及應用

更新於 發佈於 閱讀時間約 5 分鐘

前言

  這篇文章將會講述 Unity 中協程(Coroutine)的基本介紹,分享一些關於協程的應用方向,最後並總結簡單撰寫協程的步驟。

1. 聽聞已久

  其實協程是我一直都通過的東西,因為它撰寫完的程式碼可以非常的龐大與複雜,所以我曾經以為這是一個非常複雜的官方函式,後來發現這似乎是跟 C# 有關,不過依然沒有去碰觸。

2. 時間相關

  Cotoutine 是一個跟時間有關的函式,後面會做更詳細的介紹,基本上就是更加簡單好用的計時器,我們可以自己撰寫一份倒數計時的工具,也能運用協程進行計時的方式去處理問題。

3. 實用函數

  在遊戲設計中,時間是一項非常重要的事情,隨之而來用時間安排程式步驟的協成就會成為相當實用的函數,我自己判斷協程的優點非常多,對於新手而言暫時還不用擔心濫用或浪費效能這件事情。

二、協程(Coroutine)的基本介紹

  介紹 Coroutine 的一些內容。

1. 用時間來進行程式的控管

  前面有提到,它是基於時間為主軸的函式,有開始協程 (StartCoroutine) 與中斷協程 (StopCoroutine) 的內容,並且有暫停 (yield return) 幾秒後執行下一段程式碼。

2. 把工作安排到未來的時間

  它的基本概念是把工作安排到未來進行處理,不需要每一幀都進行調用,直到需要的時候才會調用,並且能避免程式工作量太大後,會在不同幀執行的效能問題,會在精準的時刻同步工作。

3. IEnumerator (列舉器)

  其中最核心的就式叫做 IEnumerator 的列舉器,我當初也是看到這個就覺得這個函式及相關知識相當複雜,因為它的字數很多以外,還有 yield retrun 這種我看不懂的程式碼,其實就是帶有時間的程式碼容器。

三、協程(Coroutine)的應用方面

  那協程通常會用於遊戲中的那些部分呢?

1. 動畫控制

  如果設計師想要讓玩家在受到攻擊後,同步處理兩項程式,並且失去控制與獲得受傷的無敵幀,那就可以使用協程進行安排,程式設計師也能很好的安排無敵時間有幾秒,受傷特效什麼時候要播放。

2. 等待時間

 擁有等待時間的東西都很適合使用協程來進行安排,如果是固定時間可以使用調用(Invoke) 擷取延遲來讓敵人固定時間重生,如果是曲線或者不具備規律的生程時間,使用協程(Coroutine)是很適合的方式。

3. 流程控制

  如果在遊戲中會出現一系列相同流程的環節,使用協程(Coroutine)來進行遊戲設計是不錯的選擇,例如敵人 AI 的設計,就能使用協程控制巡邏,在發現敵人後中斷協程,改為追尋玩家等等。

四、簡單的程式碼步驟

  接下來簡單敘述程式碼的撰寫步驟,不涉及完整的程式碼。

1. 創建一個列舉器(IEnumerator)

  首先,我們創建一個新的私人函式,這個函式使用列舉器(IEnumerator)作為宣告,並命名為 waitToDoSomeThing (等待來做某些事情)。

2. 撰寫回傳值

  因為它是一個正常的函式,因此會需要回傳值,也就是協程一定要等待幾秒鐘以後進行下一步,不過這個等待可以是零秒,撰寫方式「yield return new」後面接想要的等待形式。

  常使用的函式是等待幾秒 (WaitForSecond)這個函式,也有其它的呼叫方式可以參考,不過詳細就要自己上網尋找了,可以使用的類似項目有非常多種。

3. 開始協程

  在想要開始協程的地方使用開始協程 (StartCoroutine)就可以啟動協程,協程執行完畢以後也不用主動輸入 StopCoroutine 來結束協程,它是自行穿插在每一幀的函式,並不是創建一個新的執行緒。

五、後記

  在學習 Coroutine 的時候,我原本以為我會需要查詢大量的資料,結果我跑去跟 GPT 對話,我很喜歡跟它問問題的感覺,有耐心又有風度,也不會怕回答類似的問題,並且能追根究柢去探尋 Coroutine 的知識。


留言
avatar-img
留言分享你的想法!
其實業界已經開始捨棄Coroutine 取而代之的是C#的Async/Await附上參考資料https://gamedevbeginner.com/async-in-unity/有興趣可以看一下👍Ps.很多篇文章都寫的不錯,繼續加油!By 遊戲系畢業一陣子的社畜😅
瓶裝雪-avatar-img
發文者
2023/04/23
泡芙爸爸(泡芙爸爸) 我剛剛用 Async / Await 來製作計時器,我有一些心得與疑問:1. Async 比 Coroutine 的可讀性高。2. Async 比 Coroutine 的步驟簡單。3. Async 可以在物件銷毀後繼續計算。4. Async 不可以中斷,如果要中斷會一次中斷所有Task。5. Cotoutine 功能似乎跟 Async 相同,那麼 Invoke 也會被取代嗎? 其中 4. 我不確定是否正確,我後來有去看參考資料最後面的那篇取消,但我不太理解的是它取消沒有指定函式,感覺是直接取消所有的 Task?
瓶裝雪-avatar-img
發文者
2023/04/23
我現在才看到這則訊息,我很有興趣,非常感謝你!其實我還真的不知道自己寫的文章好不好,感謝你有跟我說XD
avatar-img
瓶裝雪的沙龍
108會員
247內容數
對設計師如何成長為設計師好奇嗎? 2020年九月,我進入大學學習當一位設計師,從開始到沉寂,再到重燃熱忱,我將在方格子紀錄我的成長歷程、理念、心情,分享我在這段旅程中所經歷的故事。
瓶裝雪的沙龍的其他內容
2024/09/22
魔火術師是第三人稱動作射擊遊戲,屬於專題畢業製作,在畢業組成新的團隊後優化並上架。
Thumbnail
2024/09/22
魔火術師是第三人稱動作射擊遊戲,屬於專題畢業製作,在畢業組成新的團隊後優化並上架。
Thumbnail
2024/01/26
這篇文章將會講述虛擬(virtual)與覆蓋(override)的簡易使用方式。
Thumbnail
2024/01/26
這篇文章將會講述虛擬(virtual)與覆蓋(override)的簡易使用方式。
Thumbnail
2023/12/29
講述遊戲設計從新手到專業的發展方向。
Thumbnail
2023/12/29
講述遊戲設計從新手到專業的發展方向。
Thumbnail
看更多
你可能也想看
Thumbnail
大家好,我是一名眼科醫師,也是一位孩子的媽 身為眼科醫師的我,我知道視力發展對孩子來說有多關鍵。 每到開學季時,診間便充斥著許多憂心忡忡的家屬。近年來看診中,兒童提早近視、眼睛疲勞的案例明顯增加,除了3C使用過度,最常被忽略的,就是照明品質。 然而作為一位媽媽,孩子能在安全、舒適的環境
Thumbnail
大家好,我是一名眼科醫師,也是一位孩子的媽 身為眼科醫師的我,我知道視力發展對孩子來說有多關鍵。 每到開學季時,診間便充斥著許多憂心忡忡的家屬。近年來看診中,兒童提早近視、眼睛疲勞的案例明顯增加,除了3C使用過度,最常被忽略的,就是照明品質。 然而作為一位媽媽,孩子能在安全、舒適的環境
Thumbnail
我的「媽」呀! 母親節即將到來,vocus 邀請你寫下屬於你的「媽」故事——不管是紀錄爆笑的日常,或是一直想對她表達的感謝,又或者,是你這輩子最想聽她說出的一句話。 也歡迎你曬出合照,分享照片背後的點點滴滴 ♥️ 透過創作,將這份情感表達出來吧!🥹
Thumbnail
我的「媽」呀! 母親節即將到來,vocus 邀請你寫下屬於你的「媽」故事——不管是紀錄爆笑的日常,或是一直想對她表達的感謝,又或者,是你這輩子最想聽她說出的一句話。 也歡迎你曬出合照,分享照片背後的點點滴滴 ♥️ 透過創作,將這份情感表達出來吧!🥹
Thumbnail
這篇文章將會快速介紹非同步函式(Async / Await)的簡易使用方式。
Thumbnail
這篇文章將會快速介紹非同步函式(Async / Await)的簡易使用方式。
Thumbnail
這篇文章將會講述這款遊戲的開發預計與遊戲內系統的清單粗估。
Thumbnail
這篇文章將會講述這款遊戲的開發預計與遊戲內系統的清單粗估。
Thumbnail
這篇文章將會講述 Unity 中協程(Coroutine)的基本介紹,分享一些關於協程的應用方向,最後並總結簡單撰寫協程的步驟。
Thumbnail
這篇文章將會講述 Unity 中協程(Coroutine)的基本介紹,分享一些關於協程的應用方向,最後並總結簡單撰寫協程的步驟。
Thumbnail
這篇文章將會分析時間,從時間的觀點再到時間的意義,最後介紹時間的各種操控,分享在遊戲設計中對時間的操作。
Thumbnail
這篇文章將會分析時間,從時間的觀點再到時間的意義,最後介紹時間的各種操控,分享在遊戲設計中對時間的操作。
Thumbnail
這篇文章將會講述時間系統,以及 time 和 deltaTime 兩個時間類型。
Thumbnail
這篇文章將會講述時間系統,以及 time 和 deltaTime 兩個時間類型。
Thumbnail
這篇文章我將會講述關於 Update 相關的函式,並介紹他們在遊戲設計中所代表的地位,當未來需要使用時可以回來參考這篇文章。
Thumbnail
這篇文章我將會講述關於 Update 相關的函式,並介紹他們在遊戲設計中所代表的地位,當未來需要使用時可以回來參考這篇文章。
Thumbnail
  這篇文章將介紹public函式應用,回顧保護層級、無類型兩個核心重點,再介紹遊戲製作重點程式(Script),再到控制中心Script製作與方針。
Thumbnail
  這篇文章將介紹public函式應用,回顧保護層級、無類型兩個核心重點,再介紹遊戲製作重點程式(Script),再到控制中心Script製作與方針。
Thumbnail
本文章將介紹Unity產品生命週期的一部分,並提供使用範例程式碼。
Thumbnail
本文章將介紹Unity產品生命週期的一部分,並提供使用範例程式碼。
Thumbnail
這篇文章會介紹一個靜態浮點數Time.deltaTime,並教導你製作計時器,以及計時器的相關知識與使用建議。
Thumbnail
這篇文章會介紹一個靜態浮點數Time.deltaTime,並教導你製作計時器,以及計時器的相關知識與使用建議。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News