前言
最近正在思考,如何呈現Unity程式會比較適合我,我可以從最開始學習的角色移動與跳躍開始撰寫,然而會錯過目前研究的程式,這讓我兩頭燒,未來會變成「現在撰寫的程式」跟「文章更新的程式」,同步更新又會導致工作量極大。
在遊戲程式,每一個遊戲程式會分開,不會全部聚集在一起,如同我前面提到的高內聚、低耦合,如果我介紹一項程式會需要一大堆程式配合,那這個程式就不是好程式了。
之前也有提到,Unity C#是讓大概懂一些的程式新手更進一步的系列,如同今天介紹的基礎計時器,我希望在閱讀這篇文章時,不會有必須要參考之前文章的強迫性,屬於「可以參考之前的文章,但非必要。」的程度。
每禎時間:Time.deltaTime
在Unity中,這項靜態浮點數的定義:
//Unity.Engine
//Time
public static float deltaTime;
這項靜態浮點數會存取每一禎會消耗的時間,每一禎的時間都有些微不同,因此這個浮點數會持續改變,如果想要親眼看看,可以參考上一章的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();
}
...(無論計時器運行與否,都會持續運作)
}
結尾
計時器是一個相當重要的程式內容,幾乎每款遊戲都會使用到時間,像是冷卻時間、攻擊間隔、血量恢復等等,而從基本的計時器就能產生相當多的變化。
在撰寫這篇文章時,我原本以為撰寫計時器會很快速,結果在客製化程式的部分我出了問題,這也讓我對計時器製作的理解更深,每當我學會一個新的程式時,在撰寫文章的時候,我能學到更多。