Unity C# | 每禎時間Time.deltaTime & 基礎計時器

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

前言

  最近正在思考,如何呈現Unity程式會比較適合我,我可以從最開始學習的角色移動與跳躍開始撰寫,然而會錯過目前研究的程式,這讓我兩頭燒,未來會變成「現在撰寫的程式」跟「文章更新的程式」,同步更新又會導致工作量極大。

  在遊戲程式,每一個遊戲程式會分開,不會全部聚集在一起,如同我前面提到的高內聚、低耦合,如果我介紹一項程式會需要一大堆程式配合,那這個程式就不是好程式了。

  之前也有提到,Unity C#是讓大概懂一些的程式新手更進一步的系列,如同今天介紹的基礎計時器,我希望在閱讀這篇文章時,不會有必須要參考之前文章的強迫性,屬於「可以參考之前的文章,但非必要。」的程度。

每禎時間:Time.deltaTime

  在Unity中,這項靜態浮點數的定義:

//Unity.Engine
//Time
public static float deltaTime;

  這項靜態浮點數會存取每一禎會消耗的時間,每一禎的時間都有些微不同,因此這個浮點數會持續改變,如果想要親眼看看,可以參考上一章的Debug.Log

Unity C# | 除錯好工具:Debug.Log & 實值類型與參考類型測試

然後在Update打出下列程式

Debug.Log(Time.deltaTime);

基礎計時器

  計時器製作分為為三部分,時間、限制。

時間

創造一個計時器變數,並讓初始值為零。

private float timer=0;

  讓計時器隨時間增加

void Update
{
  timer += Time.deltaTime;
}

  製作完成後,可以在上面加上Debug.Log(timer);

void Update
{
  timer += Time.deltaTime;
  Debug.Log(timer);
}

  用來確認時間是否正確增加

限制

  依照不同的使用需求,增加一個限制條件,譬如我希望子彈在兩秒鐘後發射出去,那就需要添加一個限制,在時間到達兩秒時會觸發。

  當我們在設計新程式的時候,會希望程式碼是易讀好理解的,所以請大膽的直接使用「不存在的變數」。

void Update
{
  timer += Time.deltaTime;
  if(timer > bulletCooldown)
  {
    timer = 0; //重置計時器
    //Debug.Log("時間重置");
  }
  //Debug.Log(timer);
}
//Debug.Log不要讓瘋狂出現的參數跟條件出現的參數同時跑,請則一。

  然後宣告不存在變數,讓他真的存在。

private float bulletCooldown=2; 

  這個動作有兩個好處,程式中的變數不會有「沒使用過」的變數,並且程式名稱相當直覺,除非你下意識用了A之類的代號類型變數。

客製化程式

  基礎的計時器如同上面這樣,然而依照不同的需求,會有不一樣的限制。

範例:「時間到了要停止」

  最直覺的想法是新增一個布林,直接添加限制進去。

void Update
{
  if(timerComplete)
  {
    timer = 0;
  }
  else
  {
    (計時器)
  }
}

  分析基礎計時器的運作

void Update
{
  ...(無論計時器運行與否,都會持續運作)  if(timer > bulletCooldown)...(計時器停止條件)
  ...(無論計時器運行與否,都會持續運作)
}

  分析問題,「時間到了要停止」相當於「時間停止前要計時」,所以把進行計時的算式移動到條件中,加上else就可以了,

void Update
{
  ...(無論計時器運行與否,都會持續運作)
  if(timer > bulletCooldown)...(計時器限制時會運作)
  {}else...(計時器限制之前會運作)
  { 
    timer += Time.deltaTime;
  }
    
  ...(無論計時器運行與否,都會持續運作)
}

補充:計時器的使用方式

  計時器製作出來了,我想有些人會直接繼續修改這個計時器,完成原本他要解決的問題,然而這會導致這個計時器變得很長,易讀性下降,變相的增加維護難度。

  更好的做法,是創造一個函式,譬如說

private void keepEnemyRelease()
{
  .......
  Debug.Log("敵人釋放");
}

  將新製作的函式放到計時器中,這樣計時器會簡潔很多

void Update
{
  if(timerComplete)...(如果時間完成)  if(timer > bulletCooldown)
  {...(計時器限制時會運作)}else...(計時器限制之前會運作)
  {
    timer += Time.deltaTime;
    keepEnemyRelease();
  }
  ...(無論計時器運行與否,都會持續運作)
}

結尾

  計時器是一個相當重要的程式內容,幾乎每款遊戲都會使用到時間,像是冷卻時間、攻擊間隔、血量恢復等等,而從基本的計時器就能產生相當多的變化。

  在撰寫這篇文章時,我原本以為撰寫計時器會很快速,結果在客製化程式的部分我出了問題,這也讓我對計時器製作的理解更深,每當我學會一個新的程式時,在撰寫文章的時候,我能學到更多。


raw-image


留言
avatar-img
留言分享你的想法!
avatar-img
瓶裝雪的沙龍
114會員
247內容數
你好,我是瓶裝雪!我是一名遊戲設計師!
瓶裝雪的沙龍的其他內容
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
常常被朋友問「哪裡買的?」嗎?透過蝦皮分潤計畫,把日常購物的分享多加一個步驟,就能轉換成現金回饋。門檻低、申請簡單,特別適合學生與上班族,讓零碎時間也能創造小確幸。
Thumbnail
常常被朋友問「哪裡買的?」嗎?透過蝦皮分潤計畫,把日常購物的分享多加一個步驟,就能轉換成現金回饋。門檻低、申請簡單,特別適合學生與上班族,讓零碎時間也能創造小確幸。
Thumbnail
嗨!歡迎來到 vocus vocus 方格子是台灣最大的內容創作與知識變現平台,並且計畫持續拓展東南亞等等國際市場。我們致力於打造讓創作者能夠自由發表、累積影響力並獲得實質收益的創作生態圈!「創作至上」是我們的核心價值,我們致力於透過平台功能與服務,賦予創作者更多的可能。 vocus 平台匯聚了
Thumbnail
嗨!歡迎來到 vocus vocus 方格子是台灣最大的內容創作與知識變現平台,並且計畫持續拓展東南亞等等國際市場。我們致力於打造讓創作者能夠自由發表、累積影響力並獲得實質收益的創作生態圈!「創作至上」是我們的核心價值,我們致力於透過平台功能與服務,賦予創作者更多的可能。 vocus 平台匯聚了
Thumbnail
這篇文章將會講述常見的座標(Transform)旋轉方式,適合初學者到進階程式員複習。
Thumbnail
這篇文章將會講述常見的座標(Transform)旋轉方式,適合初學者到進階程式員複習。
Thumbnail
前言 這是紀錄本人學習Unity C#時的筆記,希望讓自己能夠整理思緒,方便記憶。 因為是新手自學的關係,也很有可能有誤解或錯誤的地方,請見諒… 變數 宣告變數不能使用數字開頭,或是除了_之外的符號。 ·整數 int ·浮點數 float、double float 精度低、佔的資源較少,double
Thumbnail
前言 這是紀錄本人學習Unity C#時的筆記,希望讓自己能夠整理思緒,方便記憶。 因為是新手自學的關係,也很有可能有誤解或錯誤的地方,請見諒… 變數 宣告變數不能使用數字開頭,或是除了_之外的符號。 ·整數 int ·浮點數 float、double float 精度低、佔的資源較少,double
Thumbnail
這次分享的是常數、變數、宣告與初始化。 [常數]就是固定不變的數,如:PI=3.14 [變數]顧名思義就是會改變的數,如:y=2x (在數學中x確定後y才會確定,因此x為自變數,y為應變數,x、y都屬於變數) 一、常數   常數在定義的時候,一開始就必須指定好資料型別並且給予值,因為它在整個程式在執
Thumbnail
這次分享的是常數、變數、宣告與初始化。 [常數]就是固定不變的數,如:PI=3.14 [變數]顧名思義就是會改變的數,如:y=2x (在數學中x確定後y才會確定,因此x為自變數,y為應變數,x、y都屬於變數) 一、常數   常數在定義的時候,一開始就必須指定好資料型別並且給予值,因為它在整個程式在執
Thumbnail
這篇文章將會介紹函式(Function)及其回傳值(retrun)的定義及介紹。
Thumbnail
這篇文章將會介紹函式(Function)及其回傳值(retrun)的定義及介紹。
Thumbnail
分類 △單精度浮點數、單精度浮點值(float) △雙精度浮點數、雙精度浮點值(double) △長雙精度浮點數、長雙精度浮點值(long double) 有效位數是什麼? 儲存形式 不精確的原因 範圍與有效位數的差別 浮點數不被建議使用的原因 精確問題 速度問題 結論
Thumbnail
分類 △單精度浮點數、單精度浮點值(float) △雙精度浮點數、雙精度浮點值(double) △長雙精度浮點數、長雙精度浮點值(long double) 有效位數是什麼? 儲存形式 不精確的原因 範圍與有效位數的差別 浮點數不被建議使用的原因 精確問題 速度問題 結論
Thumbnail
說明 重點 △定義變數 △文字的定義 △文字與數字的差別 △整數與浮點數 △signed(有號)與unsigned(無號)的區別 △e是什麼符號? 分類 △字元 △字串 △短整數 △整數 △長整數 △超長整數 △單精度浮點數 △雙精度浮點數 △長雙精度浮點數 應用 宣告與輸出 運算符 結論
Thumbnail
說明 重點 △定義變數 △文字的定義 △文字與數字的差別 △整數與浮點數 △signed(有號)與unsigned(無號)的區別 △e是什麼符號? 分類 △字元 △字串 △短整數 △整數 △長整數 △超長整數 △單精度浮點數 △雙精度浮點數 △長雙精度浮點數 應用 宣告與輸出 運算符 結論
Thumbnail
這篇文章為介紹C#基礎知識的一部分,如果你是直接開始寫程式的C#程式員,可以看看這篇文章補足一些基礎知識。
Thumbnail
這篇文章為介紹C#基礎知識的一部分,如果你是直接開始寫程式的C#程式員,可以看看這篇文章補足一些基礎知識。
Thumbnail
這是一篇關於 CSS 動畫屬性的學習筆記,如果你剛好也在學習的話,歡迎進來看看!
Thumbnail
這是一篇關於 CSS 動畫屬性的學習筆記,如果你剛好也在學習的話,歡迎進來看看!
Thumbnail
時輪是甚麼? 這是統全數理自創概念,用於確定所有算法的商數時使用 且能夠讓程式碼設計師「逐步檢查計算過程」
Thumbnail
時輪是甚麼? 這是統全數理自創概念,用於確定所有算法的商數時使用 且能夠讓程式碼設計師「逐步檢查計算過程」
Thumbnail
變數(variable)、型別(type)、初始化(initialize)、宣告
Thumbnail
變數(variable)、型別(type)、初始化(initialize)、宣告
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News