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方法的运行,所以对于时间倒流的方法,有时间还是要研究看看,如果有知道的朋友,可以留言分享一下。

原文地址:https://www.cnblogs.com/nightcat/p/unity2d_004.html