Unity3D_Time时间相关

  • 1.Unity Time类

  • Time.time:(只读)表示从游戏开发到现在的时间,会随着游戏的暂停而停止计算。

  • Time.timeSinceLevelLoad:(只读)表示从当前Scene开始到目前为止的时间,也会随着暂停操作而停止。

  • Time.deltaTime:(只读)表示从上一帧到当前帧时间,以秒为单位。

  • Time.fixedTime:(只读)表示以秒计游戏开始的时间,固定时间以定期间隔更新(相当于fixedDeltaTime)直到达到time属性。

  • Time.fixedDeltaTime:表示以秒计间隔,在物理和其他固定帧率进行更新,在Edit->ProjectSettings->Time的Fixed Timestep可以自行设置。

  • Time.maximumDeltaTime:一帧能获得的最长时间。物理和其他固定帧速率更新(类似MonoBehaviour FixedUpdate)。

  • Time.SmoothDeltaTime:(只读)表示一个平稳的deltaTime,根据前 
    N帧的时间加权平均的值。

  • Time.timeScale:时间缩放,默认值为1。若设置<1,表示时间减慢;若设置>1,表示时间加快;若设置=0,则游戏暂停。可以用来加速、减速和暂停游戏,非常有用。

  • Time.frameCount:(只读)总帧数

  • Time.realtimeSinceStartup:(只读)表示自游戏开始后的总时间,即使暂停也会不断的增加。

  • Time.captureFramerate:表示设置每秒的帧率,然后不考虑真实时间。

  • Time.unscaledDeltaTime:(只读)不考虑timescale时候与deltaTime相同,若timescale被设置,则无效。

  • Time.unscaledTime:(只读)不考虑timescale时候与time相同,若timescale被设置,则无效。

  • 结论:

  • 1、 UnityEngine.Time.captureFramerate: 
    一旦设置了这个值(非0),每一帧会以1.0f/captureFramerate的时间更新(相对于Time.time,每一帧执行的真实时间还是不变的,其实这里再乘以Time.timeScale更合适),说白了就是改变每一帧所用的时间。这个属性并不改变Time.timeScale和Application.targetFrameRate

    2、UnityEngine.Time.deltaTime: 
    时间增量,依据Time.time,在Update里调用返回的是完成上一帧的时间,在FixedUpdate里调用返回的是FixedTimeStep的值。

    3、UnityEngine.Time.fixedDeltaTime : 
    固定增量时间,返回FixedTimeStep。FixedUpdate执行的时间间隔和物理检测的时间间隔。 
    注意一下,这个是依据的是Time.time,也就是当Time.time累加的值等于了FixedTimeStep,那么FixedUpdate和物理检测就会执行,可以理解成当时间被加速,和此时间有关的会被更频繁的执行,所以当Time.timeScale为0时,FixedUpdate不会被执行。

    4、UnityEngine.Time.fixedTime : 
    固定时间,上一次FixedUpdate开始执行的时间,从程序开始计时。

    5、UnityEngine.Time.frameCount : 
    帧计数器,返回游戏一共经过了多少帧。

    6、UnityEngine.Time.maximumDeltaTime : 
    一帧所需的最大时间,如果一帧所需的时间可能大于这个值,那么一些物理检测和其他一些固定帧的更新将会减少执行。

    7、UnityEngine.Time.realtimeSinceStartup : 
    从程序启动到现在的时间,依据系统时间,不受Time.timeScale影响,当程序处于后台时,这个时间依然有效,不会停止计时,不管程序可不可以在后台运行。

    8、UnityEngine.Time.renderedFrameCount : 
    这个没有找到任何官方文档,比较奇怪。从字面上理解,就是被渲染帧的次数。尝试在Update(还有FixedUpdate和LateUpdate,这两个和Update的值是一样的)里输出一下,会发现这个次数每次都是增加2,而不是增加1,这就很奇怪吧,Update是每一帧都要执行的,这个是肯定的,也就是再每一帧其实是渲染了两次的。想了一下,在一帧中,还有可能被执行的还有OnGUI,结果在里面输出一下发现,多增加的1果然是在这里面。这个应该用的比较少。

    9、UnityEngine.Time.smoothDeltaTime : 
    一个平滑淡出Time.deltaTime的时间。在Update里和Time.deltaTime输出比较一下就会发下,这个值是当前的Time.deltaTime和上一帧的Time.smoothDeltaTime的一个差值的中间值。

    10、UnityEngine.Time.time : 
    程序内部的一个时间,返回当前帧开始的时间,受Time.timaScale影响。在FixedUpdate里调用,将返回Time.fixedTime。当程序处于后台时,如果程序不可以在后台运行,这个时间将失效,不会再计时了。

    11、UnityEngine.Time.timeScale : 
    时间缩放,影响一切基于Time.time的行为。

    12、UnityEngine.Time.timeSinceLevelLoad : 
    从场景加载完到现在的时间,基于Time.time。

    13、UnityEngine.Time.unscaledDeltaTime : 
    忽略Time.timeScale的Time.deltaTime。在刚开始的两帧貌似不太准

    14、UnityEngine.Time.unscaledTime : 
    把每一帧的Time.unscaledDeltaTime 加起来就是这个属性的值,虽然说理解功能上Time.realtimeSinceStartup 有点相似,当时两者并不想等,就是因为Time.unscaledDeltaTime在程序开始不太准确的原因,导致和 realtimeSinceStartup 会有误差,这个要注意一下。

    总结: 
    两种时间一定要分清,一个是依赖于系统的时间,它的一秒等于现实世界的一秒;另一个是程序自己的时间,这个时间可人为控制(加速,减速),大部分属性都是基于这个时间的。

 

2.C#-System.DateTime

日期时间相关处理:

0/ 构造函数:
DateTime(Int32 年, Int32 月, Int32 日)
DateTime(年,月,日,时,分,秒,(可再加毫秒)/协调世界时 (UTC) 或本地时间)
...

1/ 属性:
DateTime dt = DateTime.Now;
dt.ToString();// 1/22/2017 3:43:19 PM
//获取一个DateTime对象,该对象设置为此计算机上的当前日期和时间,表示为本地时间。[受时区影响;我们中国使用的是东八区的时间,所以和UTC大了8个小时]

DateTime dt2 = DateTime.Today;
dt2.ToString();//1/22/2017 12:00:00AM 当天日期,其时间组成部分设置为00:00:00。

DateTime dt3 = DateTime.UtcNow ;
dt3.ToString();//1/22/2017 7:43:19 AM 此计算机上的当前日期和时间,表示为协调通用时间 (UTC,0时区的时间)

dt.Year.ToString();//2017

dt.Date.ToString();// 1/22/2017 12:00:00 AM获取此实例的日期部分;其日期与此实例相同,其时间值设置为午夜 12:00:00 (00:00:00)。

dt.Day.ToString(); //22 获取此实例所表示的日期为该月中的第几天。

dt.DayOfWeek.ToString();//Sunday 获取此实例所表示的日期是星期几。

dt.DayOfYear.ToString();//22 获取此实例所表示的日期是该年中的第几天。

dt.Hour.ToString();//14 获取此实例所表示日期的小时部分。(24h制)

dt.Kind.ToString();//Local 返回基于本地时间Local、协调世界时 (UTC),还是两者皆否

dt.Millisecond.ToString();//630 获取此实例所表示日期的毫秒部分。

dt.Minute.ToString();//35 获取此实例所表示日期的分钟部分

dt.Month.ToString();//1 获取此实例所表示日期的月部分

dt.Second.ToString();//28 获取此实例所表示日期的秒部分

dt.Ticks.ToString();//632667942284412864获取表示此实例的日期和时间的计时周期数。
//每个计时周期表示一百纳秒,即一千万分之一秒。 1 毫秒内有 10,000 个计时周期。此属性的值表示自 0001 年 1 月 1 日午夜 12:00:00(表示 DateTime.MinValue)以来经过的以 100 纳秒为间隔的间隔数。 它不包括归属于闰秒的刻度数。

dt.TimeOfDay.ToString();//15:20:43.1911987获取此实例的当天的时间。
----------
2/ 方法:
dt.ToFileTime().ToString();//131295394816200492将当前 DateTime 对象的值转换为Windows文件时间。

dt.ToFileTimeUtc().ToString();//131295683210873066将当前 DateTime 对象的值转换为 Windows 文件时间

dt.ToLocalTime().ToString();// 1/22/2017 2:19:17 PM将当前 DateTime 对象的值转换为本地时间

dt.ToLongDateString().ToString();//Sunday,January 22,2017转为长日期字符串表示形式

dt.ToLongTimeString().ToString();//2:20:33 PM转为其等效的长时间字符串表示形式。

dt.ToOADate().ToString();//42757.5978641782转换为等效的OLE自动化日期

dt.ToShortDateString().ToString();// 1/22/2017

dt.ToShortTimeString().ToString();//2:21 PM 

dt.ToUniversalTime().ToString();//1/22/2017 6:22:10AM 转换为协调世界时(UTC

dt.AddYears(1).ToString();//1/22/2018 3:51:20 PM增加/减少年(参数可为负)
dt.AddDays(1.1).ToString();//1/23/2017 6:16:36 PM
dt.AddHours(1.1).ToString();//2005-11-5 14:53:04
dt.AddMilliseconds(1.1).ToString();//2005-11-5 13:47:04
dt.AddMonths(1).ToString();//2005-12-5 13:47:04
dt.AddSeconds(1.1).ToString();//2005-11-5 13:47:05
dt.AddMinutes(1.1).ToString();//2005-11-5 13:48:10
dt.AddTicks(1000).ToString();//2005-11-5 13:47:04 计时周期数

dt.CompareTo(dt).ToString();//0 两时间比较:早于<0,同时==0,迟于>0[static&&not static]

dt.Add(?).ToString();//问号为一个时间段TimeSpan

dt.Equals("2005-11-6 16:11:04").ToString();//False [static&&not static]返回是否具有相同日期和时间
dt.Equals(dt).ToString();//True

dt.GetHashCode().ToString();//1474088234

dt.GetType().ToString();//System.DateTime

dt.GetTypeCode().ToString();//DateTime

dt.GetDateTimeFormats('s')[0].ToString();//2005-11-05T14:06:25

dt.GetDateTimeFormats('t')[0].ToString();//14:06

dt.GetDateTimeFormats('y')[0].ToString();//2005年11月

dt.GetDateTimeFormats('D')[0].ToString();//2005年11月5日

dt.GetDateTimeFormats('D')[1].ToString();//2005 11 05

dt.GetDateTimeFormats('D')[2].ToString();//星期六 2005 11 05

dt.GetDateTimeFormats('D')[3].ToString();//星期六 2005年11月5日

dt.GetDateTimeFormats('M')[0].ToString();//11月5日

dt.GetDateTimeFormats('f')[0].ToString();//2005年11月5日 14:06

dt.GetDateTimeFormats('g')[0].ToString();//2005-11-5 14:06

dt.GetDateTimeFormats('r')[0].ToString();//Sat, 05 Nov 2005 14:06:25 GMT

注:string格式字符串:
string.Format("{0:d}",dt);//2005-11-5
string.Format("{0:D}",dt);//2005年11月5日
string.Format("{0:f}",dt);//2005年11月5日 14:23
string.Format("{0:F}",dt);//2005年11月5日 14:23:23
string.Format("{0:g}",dt);//2005-11-5 14:23
string.Format("{0:G}",dt);//2005-11-5 14:23:23
string.Format("{0:M}",dt);//11月5日
string.Format("{0:R}",dt);//Sat, 05 Nov 2005 14:23:23 GMT
string.Format("{0:s}",dt);//2005-11-05T14:23:23
string.Format("{0:t}",dt);//14:23
string.Format("{0:T}",dt);//14:23:23
string.Format("{0:u}",dt);//2005-11-05 14:23:23Z
string.Format("{0:U}",dt);//2005年11月5日 6:23:23
string.Format("{0:Y}",dt);//2005年11月
string.Format("{0}",dt);//2005-11-5 14:23:23

string.Format("{0:yyyyMMddHHmmssffff}",dt);//201701221603353262
//DateTime.Now.ToString(IFormatProvider provider)用法:
//注意:HH为24小时制hh为12小时制,年月日时分秒yyyy MM dd HH mm ss
//DateTime.Now.ToString("yyyy年MM月dd日"); yyyy年MM月dd日
//DateTime.Now.ToString("HH:mm"); 19:48
-----------------------------------------------
计算某年某月的天数
int days = DateTime.DaysInMonth(2007, 8);
days = 31;
-----------------------------------------------
给日期增加一天、减少一天
DateTime dt =DateTime.Now;
dt.AddDays(1); //增加一天
dt.AddDays(-1);//减少一天
其它年份方法类似...

3.时间戳

时间戳(timestamp),通常是一个字符序列,唯一地标识某一刻的时间。 
时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总毫秒数。

1/ C#生成一个时间戳:(这里以秒为单位)

private static string GetTimeStamp()
{
    TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);  
    return Convert.ToInt64(ts.TotalSeconds).ToString();  
}

2/ C#时间戳转换为格式时间:(这里以秒为单位)

private DateTime GetTime(string timeStamp)  
{  
  DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));  //时间戳起始点转为目前时区
  long lTime = long.Parse(timeStamp + "0000000");//转为long类型  
  TimeSpan toNow = new TimeSpan(lTime); //时间间隔
  return dtStart.Add(toNow); //加上时间间隔得到目标时间
}  

From: C#时间格式转换为时间戳(互转)_无涯大者的博客-CSDN博客_c# 时间格式转换 
备:lua时间戳相关,参见另一片文章

  • 6
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值