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

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

前言

  這篇文章將會講述 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
106會員
247內容數
對設計師如何成長為設計師好奇嗎? 2020年九月,我進入大學學習當一位設計師,從開始到沉寂,再到重燃熱忱,我將在方格子紀錄我的成長歷程、理念、心情,分享我在這段旅程中所經歷的故事。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
瓶裝雪的沙龍 的其他內容
這篇文章將會講述 Blockout 的介紹和適合的材質。
這篇文章將會講解 Git 專案上傳 GitHub 的流程。
這篇文章將會講述 Animator 中 Play 和 Transition 的差異和特色。
這篇文章將會講述關於相機的核心和常用知識。
這篇文章將會介紹 Unity 相機的不同空間座標。
這篇文章將會講述時間系統,以及 time 和 deltaTime 兩個時間類型。
這篇文章將會講述 Blockout 的介紹和適合的材質。
這篇文章將會講解 Git 專案上傳 GitHub 的流程。
這篇文章將會講述 Animator 中 Play 和 Transition 的差異和特色。
這篇文章將會講述關於相機的核心和常用知識。
這篇文章將會介紹 Unity 相機的不同空間座標。
這篇文章將會講述時間系統,以及 time 和 deltaTime 兩個時間類型。
你可能也想看
Google News 追蹤
Thumbnail
/ 大家現在出門買東西還會帶錢包嗎 鴨鴨發現自己好像快一個禮拜沒帶錢包出門 還是可以天天買滿買好回家(? 因此為了記錄手機消費跟各種紅利優惠 鴨鴨都會特別注意銀行的App好不好用! 像是介面設計就是會很在意的地方 很多銀行通常會為了要滿足不同客群 會推出很多App讓使用者下載 每次
Thumbnail
這篇內容,將會講解什麼是「do until」,以及與「do until」相關的知識。包括do until的簡介、break、continue。
Thumbnail
這篇內容,將會講解什麼是「while迴圈」,以及與「while迴圈」相關的知識。包括while迴圈的簡介、while迴圈、break、continue。
Thumbnail
這篇內容,將會講解什麼是「for迴圈」,以及與「for迴圈」相關的知識。包括for迴圈的簡介、for迴圈、break、continue。
Thumbnail
這篇內容,將會講解什麼是腳本函式,以及與腳本函式相關的知識。包括腳本的簡介、使用函式(或全域變數)的注意事項、定義全域變數、定義函式、什麼是宣告、局部變數的應用。
Thumbnail
這篇內容,將會講解什麼是函式,以及與函式相關的知識。包括函式的簡介、Runtime Function、自訂函式、Script Function 腳本函式、Method 方法。
Thumbnail
本文是C#入門教程的一部分,涵蓋了流程控制的各種語句與迴圈。這包括if、else if和else語句,三元運算子,switch語句,以及for、foreach和while迴圈。文中還介紹了如何在迴圈中使用break、continue、return和goto語句。
Thumbnail
看到標題的朋友可能會覺得奇怪, 我們常常看到的不就是time.sleep嗎? 怎麼又多出了asyncio.sleep呢? 這兩者究竟差異在哪邊呢? 我們都知道sleep就是睡眠的意思, 那麼在程式的運作上就是等待, 等待一段時間之後繼續完成任務, time.sleep的部份很好理解, 就是在該段程
※ 同步概念: 單純地「由上而下」執行程式碼,而且一次只執行一件事,也就是「按順序執行,一個動作結束才能切換到下一個」。缺點是你需要「等待」事情執行完畢,才能繼續往下走。 ※ 非同步概念: 盡可能讓主要的執行程序不需要停下來等待,若遇到要等待的事情,就發起一個「非同步處理」,讓主程序繼續執行,
Thumbnail
完成了Debug.log()的測試,接著還是要跟各位簡單講一下C#的一些規則,之後看程式會(比較)看得懂。 又講到變數? 在Unity中,變數是重要的工具,用來儲存和管理資料。讓開發者能夠靈活調整遊戲的行為和性能,減少代碼的重複性,使得遊戲開發更加高效和簡潔。透過使用變數,開發者可以輕鬆修改資料
Thumbnail
程式與頻率時間 看起來這個問題有些奇怪,程式與頻率時間有什麼關係呢?一旦程式完成,似乎就不需要再理會頻率和時間了。實際上,這可能是一些不熟悉程式設計的人所提出的疑問。了解程式設計最重要的一點是,頻率和時間的安排會直接影響程式的效能和展現速度。 時間的利用 舉例來說,假設一個表單的每筆處理時間為
Thumbnail
/ 大家現在出門買東西還會帶錢包嗎 鴨鴨發現自己好像快一個禮拜沒帶錢包出門 還是可以天天買滿買好回家(? 因此為了記錄手機消費跟各種紅利優惠 鴨鴨都會特別注意銀行的App好不好用! 像是介面設計就是會很在意的地方 很多銀行通常會為了要滿足不同客群 會推出很多App讓使用者下載 每次
Thumbnail
這篇內容,將會講解什麼是「do until」,以及與「do until」相關的知識。包括do until的簡介、break、continue。
Thumbnail
這篇內容,將會講解什麼是「while迴圈」,以及與「while迴圈」相關的知識。包括while迴圈的簡介、while迴圈、break、continue。
Thumbnail
這篇內容,將會講解什麼是「for迴圈」,以及與「for迴圈」相關的知識。包括for迴圈的簡介、for迴圈、break、continue。
Thumbnail
這篇內容,將會講解什麼是腳本函式,以及與腳本函式相關的知識。包括腳本的簡介、使用函式(或全域變數)的注意事項、定義全域變數、定義函式、什麼是宣告、局部變數的應用。
Thumbnail
這篇內容,將會講解什麼是函式,以及與函式相關的知識。包括函式的簡介、Runtime Function、自訂函式、Script Function 腳本函式、Method 方法。
Thumbnail
本文是C#入門教程的一部分,涵蓋了流程控制的各種語句與迴圈。這包括if、else if和else語句,三元運算子,switch語句,以及for、foreach和while迴圈。文中還介紹了如何在迴圈中使用break、continue、return和goto語句。
Thumbnail
看到標題的朋友可能會覺得奇怪, 我們常常看到的不就是time.sleep嗎? 怎麼又多出了asyncio.sleep呢? 這兩者究竟差異在哪邊呢? 我們都知道sleep就是睡眠的意思, 那麼在程式的運作上就是等待, 等待一段時間之後繼續完成任務, time.sleep的部份很好理解, 就是在該段程
※ 同步概念: 單純地「由上而下」執行程式碼,而且一次只執行一件事,也就是「按順序執行,一個動作結束才能切換到下一個」。缺點是你需要「等待」事情執行完畢,才能繼續往下走。 ※ 非同步概念: 盡可能讓主要的執行程序不需要停下來等待,若遇到要等待的事情,就發起一個「非同步處理」,讓主程序繼續執行,
Thumbnail
完成了Debug.log()的測試,接著還是要跟各位簡單講一下C#的一些規則,之後看程式會(比較)看得懂。 又講到變數? 在Unity中,變數是重要的工具,用來儲存和管理資料。讓開發者能夠靈活調整遊戲的行為和性能,減少代碼的重複性,使得遊戲開發更加高效和簡潔。透過使用變數,開發者可以輕鬆修改資料
Thumbnail
程式與頻率時間 看起來這個問題有些奇怪,程式與頻率時間有什麼關係呢?一旦程式完成,似乎就不需要再理會頻率和時間了。實際上,這可能是一些不熟悉程式設計的人所提出的疑問。了解程式設計最重要的一點是,頻率和時間的安排會直接影響程式的效能和展現速度。 時間的利用 舉例來說,假設一個表單的每筆處理時間為