? ? ? ? 眾所周知,每一個游戲都會有自己的時間。這個時間可以是內部,從游戲開始的時間,也可以是外部真實的物理時間,時間相關內容 主要用于游戲中 參與位移計時 時間暫停等。那么我們今天就來看看Unity中和時間相關的內容。
Unity時間功能速查表
類別 | 屬性/方法 | 作用 | 受Time.timeScale 影響 | 應用場景 | 示例代碼 |
---|---|---|---|---|---|
基礎時間 | Time.time | 游戲啟動后的累計時間(秒) | 是 | 計時器、技能冷卻 | float startTime = Time.time; |
Time.realtimeSinceStartup | 游戲啟動后的真實時間(秒) | 否 | 實際游戲時長記錄、不受暫停影響的邏輯 | float realTime = Time.realtimeSinceStartup; | |
Time.timeSinceLevelLoad | 當前場景加載后的累計時間(秒) | 是 | 場景事件觸發 | if (Time.timeSinceLevelLoad > 10f) { ... } | |
增量時間 | Time.deltaTime | 上一幀到當前幀的時間間隔(秒) | 是 | 平滑運動、動畫 | transform.Translate(Vector3.forward * speed * Time.deltaTime); |
Time.unscaledDeltaTime | 上一幀到當前幀的真實時間間隔 | 否 | 游戲暫停時的UI動畫 | uiElement.Translate(Vector2.up * speed * Time.unscaledDeltaTime); | |
時間縮放 | Time.timeScale | 全局時間縮放(0=暫停,1=正常,>1=加速) | - | 暫停、慢動作、加速效果 | Time.timeScale = 0; // 暫停游戲 |
固定時間步長 | Time.fixedDeltaTime | 物理更新(FixedUpdate )的時間間隔(默認0.02秒) | 是 | 剛體運動、物理模擬 | rigidbody.AddForce(Vector3.up * force * Time.fixedDeltaTime); |
其他屬性 | Time.frameCount | 游戲啟動后的總渲染幀數 | 否 | 性能測試、按幀觸發邏輯 | if (Time.frameCount % 60 == 0) { ... } // 每秒執行一次 |
Time.maximumDeltaTime | 單幀最大允許時間(避免卡頓導致邏輯錯誤,默認0.333秒) | - | 極端卡頓保護 | 通過Edit > Project Settings > Time 調整 | |
協程與時間控制 | WaitForSeconds | 協程等待指定時間(受Time.timeScale 影響) | 是 | 受時間縮放的延遲邏輯 | yield return new WaitForSeconds(2f); |
WaitForSecondsRealtime | 協程等待真實時間(不受Time.timeScale 影響) | 否 | 不受暫停影響的延遲邏輯 | yield return new WaitForSecondsRealtime(2f); | |
暫停與恢復 | Time.timeScale = 0 | 暫停游戲邏輯(需額外暫停音頻) | - | 游戲暫停菜單 | Time.timeScale = 0; AudioListener.pause = true; |
Time.timeScale = 1 | 恢復游戲邏輯(需恢復音頻) | - | 恢復游戲運行 | Time.timeScale = 1; AudioListener.pause = false; |
依次介紹:
一、什么是TimeScale?
????????Time.timeScale?是 Unity 中一個全局控制游戲時間流速的浮點數值。你可以通過修改它的值,直接改變游戲內時間的流逝速度。說人話,就是倍速,你看視頻有倍速選擇吧,這個也是。這個就是里面的時間流速,等會我們可以結合著Time.time具體查看。
基本規則
默認值為 1,表示時間正常流逝。
設為 0:游戲時間完全暫停(類似“游戲暫停”效果)。
大于 1(如 2):時間加速(雙倍速運行)。
介于 0 和 1(如 0.5):時間減速(慢動作效果)。
使用:
// 暫停游戲
Time.timeScale = 0;
// 恢復游戲
Time.timeScale = 1;
// 慢動作效果(50%速度)
Time.timeScale = 0.5f;
二、基礎時間
1、Time.time:
游戲啟動后的累計時間(秒)
當我們在Update中打印時間信息時,發現就是游戲開始了多少時間。 ??
Debug.Log(Time.time);
接下來我們改變一下速度看看,可以看到明顯快了很多。所以他是受到Time.timeScale影響的
Time.timeScale =2;
Debug.Log(Time.time);
?
2、Time.realtimeSinceStartup,
游戲啟動后的真實時間(秒)。就是游戲一旦開始,就開始計時。
將時間規模調至0后,時間仍在流逝,所以他不受timeScale的影響。?
?
3、Time.timeSinceLevelLoad:
當前場景加載后的累計時間(秒)。簡而言之就是從當前場景加載完成后開始計時。
可見其受到timeScale的影響。好的你應該以及知道了,關于timeScale這玩意的作用了,接下來我們不再贅述。
二、增量時間?
1、Time.deltaTime:
上一幀到當前幀的時間間隔(秒)。
????????這個是什么意思呢,意思就是:在游戲中我們的畫面都是一幀一幀的拼湊起來的,他不是連續的,之所以我們看著是連續的,是因為其間隔時間很短很短,短倒你無法察覺。一般來說看視頻24幀就行。但是,由于你的游戲是和你的設備性能息息相關的,所以幀率是波動的。也就是說一秒你可能跑90幀,別人跑120幀,那么他就可以在這多的30幀打你。但是每一幀的間隔時間你是可以在Unity中自己控制的,為了保證大家的幀率基本差不多,你可以將這個幀間隔時間設大一點,讓大家處于同一起跑線。
? ? ? ? 請看:可以看出并不固定。這就是幀的波動,取決于你的設備性能。下面的時間也是一樣,只是不會受到Time.timeScale的影響。
?
2、Time.unscaledDeltaTime:
上一幀到當前幀的時間間隔(秒)
將timeScale調為0
關于協程的時間相關我們后面學習協程的時候學習,現在先跳過。
三、其他屬性
1、Time.fixedDeltaTime?
物理更新(FixedUpdate
)的時間間隔(默認0.02秒)
????????請注意是在FixedUpdate中打印哈,不然你就會一直看到有數值。注意到當我們調成0之后,他就不會在增加次數了,所以他是有影響的。?
這個也分為受Time.timeScale影響和不受Time.timeScale影響的Time.fixedUnscaledDeltaTime
2、Time.frameCount?
游戲啟動后的總渲染幀數 這個就是幀數
3、Time.maximumDeltaTime:
單幀最大允許時間(避免卡頓導致邏輯錯誤,默認0.333秒)
????????Time.maximumDeltaTime是 Unity 中一個用于?防止極端卡頓導致邏輯異常?的安全機制。它的核心作用是限制單幀的增量時間(Time.deltaTime
)的最大值,避免因幀率驟降引發游戲邏輯錯誤(如物體瞬移、物理穿透等)。 就是說當前這一幀解決不了的事情,給下一幀來解決,不要一直停留在原地,因為沒有人會一直等你。??
四、快捷設置
在Edit ->ProjecSetting->Time下面可以自己設置相關的參數:
1. Fixed Timestep(固定時間步長)
????????默認值:0.02?秒(對應每秒 50 次物理更新)。
????????作用:控制物理引擎(FixedUpdate)的更新頻率,確保物理模擬的穩定性。
值越小:物理模擬更精確,但 CPU 負擔增加(如?0.01?秒對應每秒 100 次更新)。值越大:物理模擬頻率降低,可能導致剛體運動不夠平滑(如?0.04?秒對應每秒 25 次更新)。
2. Maximum Allowed Timestep(單幀最大允許時間步長)
????????默認值:0.3333333?秒(約 333 毫秒)。
????????作用:限制單幀的最大增量時間(Time.deltaTime),防止極端卡頓導致邏輯異常(如物體瞬移)。
工作原理:
????????當某一幀耗時超過此值時,Unity 會將時間拆分為多個小段(每段不超過該值),并逐段更新邏輯和物理。例如:若一幀耗時 1 秒,且此值設為?0.333
,Unity 會將該幀拆分為 3 次邏輯更新(每次?0.333
?秒)和 1 次剩余更新(0.001
?秒)。
設置建議:
????????移動端或性能波動大的平臺:保持默認值,避免邏輯失控。高精度物理游戲:可降低至?0.1
?秒,但會增加 CPU 負載。
3.Maximum Particle Timestep(粒子系統最大時間步長)
默認值:0.03?秒(30 毫秒)。
作用:限制粒子系統(ParticleSystem)單幀更新的最大時間步長,防止極端卡頓導致粒子效果異常(如粒子突然爆炸或消失)。和上面的最大幀間隔時間類似
工作原理:
????????若一幀耗時超過此值,粒子系統會按此步長分段更新。例如,一幀耗時?0.1
?秒,粒子系統會分 4 次更新(0.03 + 0.03 + 0.03 + 0.01
)。
參數 | 關聯對象 | 調整優先級 | 典型場景 |
---|---|---|---|
Fixed Timestep | 物理引擎(剛體) | 高 | 賽車游戲、物理解謎 |
Maximum Allowed Timestep | 游戲邏輯更新 | 中 | 移動端游戲、開放世界 |
Time Scale | 全局時間控制 | 動態調整 | 暫停菜單、慢動作特效 |
Maximum Particle Timestep | 粒子系統 | 低 | 爆炸特效、復雜粒子場景 |
就這樣,債見!?