通常游戏中的时间,与现实时间有很大的区别。
比如说策划会给我们类似的需求:在游戏中的一天,在现实世界中只有12分钟。
这个时候就需要用到单位换算,为了防止切换地图影响时间,我们以现实时间为准,推导出如下结论:
500ms=0.5s=1m,30s=1h,12m=一天
由此可以通过如下步骤求解:
第一步,通过时间戳,算出当前已经过去的毫秒数
/// <summary>
/// 转换时间戳
/// </summary>
public static long TimestampLongTicks()
{
DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1, 0, 0, 0, 0));
return (DateTime.Now.Ticks - startTime.Ticks);
}
public static long TimestampLongMs()
{
return TimestampLongTicks() / 10000;
}
/// <summary>
/// 获得今天的毫秒数
/// </summary>
public static long TimestampLongDay()
{
var sysTime = TimestampLongMs();
int sysTimeZone = 8;//给定时间戳的时区
return (sysTime + sysTimeZone * 3600000) % 86400000;
}
第二步,通过当前已过去的毫秒数,算出游戏时间的时分,代码片段如下
//通过时间戳计算出当前游戏时间
var _num = TimestampLongDay();
//获取当前秒数
var _ms = _num %720000;
gameTime = _ms / 500;
h = (int)gameTime / 60;
m = (int)gameTime % 60;
第三步,封装为显示出来的游戏时间并进行整点播报(可省略),代码片段如下:
gameTimeStr = "";
var _beforeH = "";
if (h <= 9) _beforeH = "0";
gameTimeStr += _beforeH + h + ":";
var _beforeM = "";
if (m <= 9) _beforeM = "0";
gameTimeStr += _beforeM + m;
Debug.Log(GameTimeStr);
if (m == 0) Debug.LogError("整点播报");
打印测试结果如下: