Unity3D 游戲計時功能實現


最近工作實在是太忙了,沒辦法認真寫博客,但是還是要好好記錄下日常的學習。

 

需求

各類游戲中都大量運用到計時功能,不管是直接顯示的在前端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     }
Clock

 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     }
TimeFormatBase

 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     }
TimeChineseFormat

 

 

總結

TImeScale方法改變速度的范圍是0~100之間,超過這個范圍會報錯,所以使用的時候我直接使用了Mathf.Clamp對其進行了限制,防止越界。於此同時,Time.time方法只是記錄了游戲運行開始的時間,日常游戲中我們所需要的是進入游戲后的時間,這里還需要進行下改進。有些游戲中還存在時間倒流的功能。TimeScale顯然無法處理,如果只是當存的現實時間倒流,其實只要將取的時間變為負值即可,但是timescale方法同時會影響到諸如Update方法的運行,所以對於時間倒流的方法,有時間還是要研究看看,如果有知道的朋友,可以留言分享一下。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM