推薦閱讀
- CSDN主頁
- GitHub開源地址
- Unity3D插件分享
- 簡書地址
- 我的個人博客
- QQ群:1040082875
? 大家好,我是佛系工程師☆恬靜的小魔龍☆,不定時更新Unity開發技巧,覺得有用記得一鍵三連哦,
一、前言
凡是用到時間,日期的都免不了要用到時間類DateTime,那么DateTime類跟Time類又有啥區別呢,
DateTime類的函式以及屬性怎么用呢,
這一篇文章就將這些知識拿捏的明明白白,
二、Time和DateTime的區別
首先,來看一下Time和DateTime類的區別,
Time類是在 using UnityEngine; 命名空間下,
DateTime類是在 using System; 命名空間下,
從命名空間就可以看出來,Time類是Unity自帶的時間類,而DateTime類是C#語言下的時間類,
Time類主要是保存Unity里面一系列和時間相關的資料,比如Time.time表示從游戲開始到現在的時間,會隨著游戲暫停而停止,Time.deltaTime 表示從上一幀到當前幀時間,以秒為單位,又稱增量時間,
而DateTime類主要是獲取時間日期等相關的資料,比如DateTime.Now表示獲取當前時間,DateTime.DaysInMonth(2007, 8)表示計算某年某月的天數,
三、Time和DateTime的使用
Time時間類

圖中,小紅旗標識的為只讀值,紫色標注的為可讀可寫,
代碼演示:
using UnityEngine;
public class TestTime : MonoBehaviour
{
void Start()
{
Debug.Log(Time.time); //表示從游戲運行到現在的時間,會隨著游戲的暫停而停止計算,
Debug.Log(Time.deltaTime); //表示從上一幀到當前幀的時間,以秒為單位,
Debug.Log(Time.unscaledDeltaTime); //不考慮timescale時候與deltaTime相同,若timescale被設定,則無效,
Debug.Log(Time.timeSinceLevelLoad); //表示從當前Scene開始到目前為止的時間,也會隨著暫停操作而停止,
Debug.Log(Time.unscaledTime); //不考慮timescale時候與time相同,若timescale被設定,則無效,
Debug.Log(Time.fixedDeltaTime); //表示以秒計間隔,在物理和其他固定幀率進行更新,在Edit->ProjectSettings->Time的Fixed Timestep可以自行設定,
Debug.Log(Time.realtimeSinceStartup); //表示自游戲開始后的總時間,即使暫停也會不斷的增加,
Debug.Log(Time.frameCount); //總幀數
Debug.Log(Time.fixedTime); //表示以秒計游戲開始的時間,固定時間以定期間隔更新(相當于fixedDeltaTime)直到達到time屬性,
Debug.Log(Time.smoothDeltaTime); //表示一個平穩的deltaTime,根據前 N幀的時間加權平均的值,
Debug.Log(Time.timeScale); //時間縮放,默認值為1,若設定<1,表示時間減慢,若設定>1,表示時間加快,可以用來加速和減速游戲,非常有用,
Debug.Log(Time.captureFramerate); //表示設定每秒的幀率,然后不考慮真實時間,
}
}
Time類主要作用就是為了從Unity的運行中獲取與時間相關的資訊,
比如Time.time表示從游戲運行到現在的時間,Time.deltaTime表示從上一幀到當前幀的時間,以秒為單位,通常移動的代碼會用Time.deltaTime做平滑處理,讓每一幀移動的距離都是合理的,
DateTime類

圖中,小紅旗標識的為只讀值,藍色為函式,
代碼演示:
using System;
using UnityEngine;
public class TestTime : MonoBehaviour
{
void Start()
{
Debug.Log(DateTime.Now);//當前本地時間 (年月日時分秒) -- 04/08/2020 14:06:48
Debug.Log(DateTime.UtcNow);//當前世界時間 (年月日時分秒) -- 04/08/2020 06:08:58
Debug.Log(DateTime.Now.Year);//當前時間 (年)
Debug.Log(DateTime.Now.Month);//當前時間 (月)
Debug.Log(DateTime.Now.Day);//當前時間 (日)
Debug.Log(DateTime.Now.Hour);//當前時間 (時)
Debug.Log(DateTime.Now.Minute);//當前時間 (分)
Debug.Log(DateTime.Now.Second);//當前時間 (秒)
Debug.Log(DateTime.Now.AddDays(1));//后一天時間 04/09/2020 14:06:48
Debug.Log(DateTime.Now.Date);//當前零點時間 00:00:00
Debug.Log(DateTime.Compare(DateTime.Now, DateTime.Now));//時間比較
Debug.Log(DateTime.DaysInMonth(2021, 9));//獲取某年某月的天數
Debug.Log(DateTime.IsLeapYear(2021));//判斷是否是閏年
Debug.Log(DateTime.Parse("2021年9月13日 16:04:42"));//格式化字串
Debug.Log(DateTime.SpecifyKind(DateTime.Now,DateTimeKind.Unspecified));//指定格式
//實體化DateTime類
DateTime testTime = new DateTime(2021,9,13);
testTime.ToLocalTime();
Debug.Log(testTime.ToLocalTime());//本地時間
Debug.Log(testTime.DayOfWeek);//回傳星期的數值
Debug.Log(testTime.Date);//獲取日期
Debug.Log(testTime.AddDays(1));//添加天數
}
}
DateTime時間類更多的是對日期時間的獲取與操作,
比如獲取當前時間DateTime.Now,獲取某年某月的天數DaysInMonth(2021, 9))等,
下面,就介紹一下Time和DateTime的實際應用,
四、應用實體
4-1、Time類測驗函式的性能
代碼:
using System;
using UnityEngine;
public class TestTime : MonoBehaviour
{
void Start()
{
//Time.realtimeSinceStartup: 表示自游戲開始后的總時間,即使暫停也會不斷的增加,
float time_1 = Time.realtimeSinceStartup;
for (int i = 0; i < 10; i++)
{
Function_1();
}
float time_2 = Time.realtimeSinceStartup;
Debug.Log("函式Function_1所用時間:" + (time_2 - time_1));
float time_3 = Time.realtimeSinceStartup;
for (int i = 0; i < 10; i++)
{
Function_2();
}
float time_4 = Time.realtimeSinceStartup;
Debug.Log("函式Function_2所用時間:" + (time_4 - time_3));
}
private void Function_1()
{
int num = 1;
for (int i = 0; i < 100; i++)
{
num += 5;
}
}
private void Function_2()
{
int num = 1;
for (int i = 0; i < 100; i++)
{
num -= 5;
}
}
}
運行結果:

4-2、Time類控制物體移動
代碼:
using System;
using UnityEngine;
public class TestTime : MonoBehaviour
{
public GameObject Cube;
void Update()
{
Cube.transform.Translate(Vector3.forward * Time.deltaTime * 30);
}
}
運行效果:

4-3、Time類控制對游戲進行加速、減速和暫停
這個主要使用Time類的timeScale屬性進行控制:
using System;
using UnityEngine;
public class TestTime : MonoBehaviour
{
//暫停游戲
public void Pause(bool isPause)
{
if (isPause)
{
Time.timeScale = 0;
isPause = false;
}
else
{
Time.timeScale = 1;
isPause = true;
}
}
}
4-4、DateTime類計算兩個日期之間的天數差
代碼:
using System;
using UnityEngine;
public class TestTime : MonoBehaviour
{
void Start()
{
DateTime dt1 = new DateTime(2007, 8, 1);
DateTime dt2 = new DateTime(2007, 8, 15);
TimeSpan span = dt2.Subtract(dt1);
Debug.Log(span.Days); //回傳天數差
Debug.Log(span.Hours); //回傳天數差中的小時數
Debug.Log(span.Seconds); //回傳天數差中的秒數
Debug.Log(span.TotalSeconds); //回傳開始時間到結束時間的總秒數
}
}
運行結果:

4-5、DateTime類格式化輸出
using System;
using UnityEngine;
public class TestTime : MonoBehaviour
{
void Start()
{
DateTime dt = DateTime.Now;
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
Debug.Log(dt.ToString("d"));//短日期:2021/9/13
Debug.Log(dt.ToString("D"));//長日期:2021年9月13日
Debug.Log(dt.ToString("f"));//完整短日期/時間:2021年9月13日 17:17
Debug.Log(dt.ToString("F"));//完整長日期/時間:2021年9月13日 17:17:07
Debug.Log(dt.ToString("g"));//常規短日期/時間:2021/9/13 17:17
Debug.Log(dt.ToString("G"));//常規長日期/時間:2021/9/13 17:17:07
Debug.Log(dt.ToString("R"));//日期時間:Mon, 13 Sep 2021 17:17:07 GMT
Debug.Log(dt.ToString("s"));//可排序日期:2021-09-13T17:17:07
Debug.Log(dt.ToString("t"));//短時間:17:17
Debug.Log(dt.ToString("T"));//長時間:17:17:07
Debug.Log(dt.ToString("u"));//通用可排序日期/時間:2021-09-13 17:17:07Z
Debug.Log(dt.ToString("U"));//通用完整日期/時間:2021年9月13日 9:17:07
Debug.Log(dt.ToString("Y"));//年月:2021年9月
Debug.Log(dt.ToString("M"));//月日:9月13日
Debug.Log(dt.ToString("yyyy"));//年
Debug.Log(dt.ToString("MM"));//月
Debug.Log(dt.ToString("dd"));//日
Debug.Log(dt.ToString("hh"));//時
Debug.Log(dt.ToString("mm"));//分
Debug.Log(dt.ToString("ss"));//秒
}
}
運行結果:

4-6、DateTime類計算距離零點的時間
using System;
using UnityEngine;
public class TestTime : MonoBehaviour
{
void Start()
{
TimeSpan date;
date = DateTime.Now.AddDays(1).Date - DateTime.Now;
//距離零點時間
Debug.Log(string.Format("{0:D2}:{1:D2}:{2:D2}", date.Hours, date.Minutes, date.Seconds));
}
}
運行結果:

4-7、DateTime類制作時間進度條
代碼:
using System;
using UnityEngine;
using UnityEngine.UI;
public class TestTime : MonoBehaviour
{
public Text TextCurrentTime;
public Slider Slider;
private DateTime CurrentTime;
private float sliderValueScale = 0.1f;
private DateTime StartTime;
private DateTime EndTime;
private bool isPlay = true;
void Start()
{
StartTime= DateTime.Now;
CurrentTime = StartTime;
EndTime = DateTime.Now.AddSeconds(10);//增加10秒
TimeSpan timeSpan = EndTime.Subtract(StartTime);
double totalSeconds = timeSpan.TotalSeconds;//回傳開始時間到結束時間的總秒數
sliderValueScale = (float)(1 / totalSeconds);//回傳slider播放的速度
}
void Update()
{
if (isPlay)
{
if (CurrentTime >= EndTime)
{
isPlay = false;
}
CurrentTime = CurrentTime.AddSeconds(1 * Time.deltaTime);
TextCurrentTime.text = CurrentTime.ToString();
Slider.value += sliderValueScale * Time.deltaTime;
}
}
}
效果圖:

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/300351.html
標籤:其他
上一篇:前綴和(區間和)
