最近工作實在是太忙了,沒辦法認真寫博客,但是還是要好好記錄下日常的學習。
需求
各類游戲中都大量運用到計時功能,不管是直接顯示的在前端UI,還是后台運行。
思路
Unity中提供了Time類可以方便的進行時間上的獲取,下面的例子中,我對其進行的簡單的封裝,能夠方便的運用到各類型的游戲中。不少游戲中同時還提供了加速,暫停等等功能,unity中的TimeScale屬性可以很方便的實現這些功能。
實現
計時的功能實現起來還是比較的方便。unity的Time.time能個距離游戲開始的時間,利用Mathf.FloorToInt方法取整,就等到了距離游戲開始多少秒,簡單的寫了兩個時間轉換的方法。

1 void OnGUI() 2 { 3 GUI.skin = clockGuiSkin; 4 NowTime = TimeFormatBase(Mathf.FloorToInt(Time.time)); 5 GUI.Label(new Rect(screenWidth*0.8f, screenHeight*0.05f, 120f, 30f), NowTime); 6 7 if(GUI.Button(new Rect(10,10,100,30),"暫停")) 8 { 9 Debug.Log("Stop"); 10 Stop(); 11 } 12 if (GUI.Button(new Rect(10, 60, 100, 30), "加速")) 13 { 14 timeScale = Mathf.Clamp(timeScale*2,0,100); 15 16 SetTimeScale(timeScale); 17 Debug.Log("Quick:" + timeScale); 18 } 19 }

1 tring TimeFormatBase(float nTotalTime) 2 { 3 string time = string.Empty; 4 float hour = Mathf.Floor(nTotalTime / 3600); 5 float min = Mathf.Floor(nTotalTime % 3600 / 60); 6 float sec = nTotalTime % 60; 7 if(hour >= 0 && hour <10) 8 time = string.Concat("0",hour,":"); 9 else 10 time = string.Concat(hour, ":"); 11 12 if (min >= 0 && min < 10) 13 time = string.Concat(time, "0", min, ":"); 14 else 15 time = string.Concat(time, min, ":"); 16 17 if (sec >= 0 && sec < 10) 18 time = string.Concat(time, "0", sec); 19 else 20 time = string.Concat(time, sec); 21 return time; 22 }

1 string TimeChineseFormat(float nTotalTime) 2 { 3 string time = string.Empty; 4 float day = Mathf.Floor(nTotalTime / 86400); 5 float hour = Mathf.Floor(nTotalTime % 86400 / 3600); 6 float min = Mathf.Floor(nTotalTime % 3600 / 60); 7 float sec = nTotalTime % 60; 8 if (day > 0) 9 time = string.Concat(day, "天"); 10 if(hour>0) 11 time = string.Concat(time,hour, "時"); 12 if(min>0) 13 time = string.Concat(time,min, "分"); 14 if(sec>0) 15 time = string.Concat(time,sec, "秒"); 16 return time; 17 }
總結
TImeScale方法改變速度的范圍是0~100之間,超過這個范圍會報錯,所以使用的時候我直接使用了Mathf.Clamp對其進行了限制,防止越界。於此同時,Time.time方法只是記錄了游戲運行開始的時間,日常游戲中我們所需要的是進入游戲后的時間,這里還需要進行下改進。有些游戲中還存在時間倒流的功能。TimeScale顯然無法處理,如果只是當存的現實時間倒流,其實只要將取的時間變為負值即可,但是timescale方法同時會影響到諸如Update方法的運行,所以對於時間倒流的方法,有時間還是要研究看看,如果有知道的朋友,可以留言分享一下。