創作內容

22 GP

Unity3D製作計數器「StartCoroutine應用」

作者:冰劍士-冰雪飛│2014-11-08 17:08:00│贊助:1,050│人氣:30292
各位好,今天來寫點對於遊戲常用的技術

本篇要使用 StartCoroutine 來製作我們遊戲常看到的計數器
=====================================================================
當我們想要撰寫一個角色執行某的動作持續幾秒時

雖然可以使用以下的寫法,在 if 區段內撰寫你幾秒內要執行的動作

不過相信我,你絕對不會想這樣寫的,雖然程式碼的邏輯本身沒錯
但這樣會讓程式變得又臭又長,而且也難以整理維護
所以我們必須使用更有效率的方法來寫作,這時候 StartCoroutine 就派得上用場
=====================================================================
StartCoroutine

使用 StartCoroutine 之前我們要做個事前準備 IEnumerator 介面

IEnumerator 宣告名稱()
{
程式碼
yield return 0;
}
程式碼可以像範例那樣寫迴圈計時,當然不想這樣寫也可以

兩種使用 StartCoroutine 執行 IEnumerator 介面
StartCoroutine("宣告名稱",參數1,參數2,.......);
StartCoroutine(宣告名稱(參數1,參數2,.....));
IEnumerator 介面內沒參數,後面參數可以不用填
當然,參數也可以使用陣列來設定,請參考Boxing/Unboxing

=====================================================================
再來我們看 StartCoroutine 的運作流程,我們使用上圖的範例來解釋流程

當程式碼碰到 StartCoroutine 會去執行 IEnumerator 介面內的程式
程式執行到 yield return 0; 時會先跳離介面同步執行 StartCoroutine 之後的程式
然後再回去繼續執行 IEnumerator 介面
直到迴圈結束沒遇到 yield return 0; 結束 StartCoroutine

當然 IEnumerator 介面執行時也可以再塞 StartCoroutine 來執行其他 IEnumerator 介面

基本運行基本上跟 ThreadStart 委派很像(或者就是 ThreadStart 委派)

當然有啟動就有暫停
StopCoroutine
StopAllCoroutines

而Unity3D內建的一個計數器 WaitForSeconds(等待秒數)
要注意的是 WaitForSeconds 一定要寫在 IEnumerator 介面內,且在 yield return 後
=====================================================================
流程有點複雜,不太好講,我盡可能實驗程式來講明白,有錯請糾正

以上技巧適合使用在劇情事件發生的時,控制秒數執行角色動作

當然應該是有其他用途,能的話留言舉例下吧
引用網址:https://home.gamer.com.tw/TrackBack.php?sn=2649394
All rights reserved. 版權所有,保留一切權利

相關創作

同標籤作品搜尋:Unity(遊戲引擎)

留言共 7 篇留言

Shark
coroutine我用過的地方是拿來控制狀態比較多的角色,例如某個boss有「戰鬥前事件→第一階段(三種攻擊模式)→第二階段(三種攻擊模式)→戰鬥後事件」這樣的狀態變化,用callback很難寫,用coroutine循序處理會比較容易。

跟thread比起來coroutine的好處是能平行處理同時容易控制同步,thread可以說是fire & forget,不用手動切換但比較難控制同步。

11-12 01:13

冰劍士-冰雪飛
感謝補充11-12 07:35
悠浪貓
替你補充一個 yield break;

可以直接跳離並結束這個Coroutine

11-15 16:31

冰劍士-冰雪飛
感謝補充11-15 16:33
⚔不止星爆還很快呢⚔
最近要用到這功能 請問 用for()
而不用if(i<5)i+=time.deltaTim
是特別的用法 還是都可以

07-02 03:30

冰劍士-冰雪飛
能說明的再詳細點嗎?07-02 11:05
⚔不止星爆還很快呢⚔
for(float i=0;i<5;i+=time.deltaTime){

yield return 0;
}
改成
float i=0
if(i<5)
yield return 0;
i+=time.deltaTim
還有
yield return 0<--這0有代表甚麼意思嗎?

07-02 11:10

冰劍士-冰雪飛
我這段是有跑迴圈,你這邊也有要跑迴圈?
yield return 0 好像是一個中斷點,這樣寫似乎會回傳0(不是很確定)
也可以寫成yield return Null07-02 11:38
⚔不止星爆還很快呢⚔
我自己多試了幾次
知道 該怎寫了
感謝你的回覆

07-02 11:49

暗黑炒蛋
原來StartCoroutine是用來調用IEnumerator的函式呀!
謝謝大大分享好文~

08-19 14:23

TikaEvo

12-12 16:28

我要留言提醒:您尚未登入,請先登入再留言

22喜歡★a1455785 可決定是否刪除您的留言,請勿發表違反站規文字。

前一篇:資策會Unity課程「C... 後一篇:資策會Unity課程「遊...

追蹤私訊切換新版閱覽

作品資料夾

ss910328 你各位
小屋更新歡迎看看 路娜公主的模型太棒啦看更多我要大聲說昨天21:52


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】