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