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方法的运行,所以对于时间倒流的方法,有时间还是要研究看看,如果有知道的朋友,可以留言分享一下。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?