時間(Time)與幀(Frame)

Unity 中有一個 Time 類(class),它提供了與時間相關的重要方法,讓你可以在專案中使用。


在 Unity 中,有兩個追蹤時間(track time)的系統,一個是每步之間的時間量是可變的,另一個是每步之間的時間量是固定的。

  • 可變時間步長(variable time step)系統:在每次繪製畫面和運行你的APP或遊戲程式碼時執行一次。
  • 固定時間步長(fixed time step)系統:以預定義的時間步長前進,並且與畫面的更新無關。這個系統通常與物理系統相關聯,物理系統會按照固定時間步長的速率運行,但你也可以在每個固定時間步長中執行自己的代碼。

可變動幀率(Variable Frame Rate):在 Unity 中每一幀所執行的時間會因為程式碼複雜度或是顯示畫面的複雜度而有所不同,同時也會受到裝置設備的效能影響。

固定時間步長(Fixed Timestep):在 Unity 中,它的物理系統使用固定時間步長(Fixed Timestep),防止突然出現物體在一幀內移動非常大距離的狀況。

Unity 的時間邏輯流程圖:此文將說明 Unity 是如何處理時間的。

Time 類屬性在幀率變化中的範例:在此文中將說明 Time 類中的各屬性是如何處理突如其來的幀率大幅變動。

錄製遊戲影片:錄製遊戲影片是時間管理中的一個特例。保存螢幕圖片的操作需要耗費相當多的時間,這會導致遊戲的正常幀率降低,錄製出的影片無法反映遊戲的實際表現。為了解決這個問題,可以使用 Unity 提供的 captureFramerate 屬性,來調整錄製時的幀率。

一個簡單的技能冷卻計時器:將示範如何使用 Time.deltaTime 來製作技能冷卻時間。


Time 類有以下 static 屬性

captureDeltaTime 減慢你APP的播放時間(playback time),以便 Unity 能夠在幀與幀之間保存截圖。
captureFramerate Time.captureDeltaTime 的倒數(reciprocal),即 1/captureDeltaTime
deltaTime 從上一個幀到目前幀之間的時間間隔,單位是秒 (只可讀)
fixedDeltaTime 固定間隔幀時間
fixedTime 從遊戲開始到現在 FixedUpdate 進行的時間,以秒為單位 (只可讀)
fixedTimeAsDouble fixedTime 相同,但是是 double 型態 (只可讀)
fixedUnscaledDeltaTime 每次 FixedUpdate 之間的固定時間間隔,以秒為單位,且不受timeScale影響(timeScale-independent)。(只可讀)。這表示調整timeScale時(如暫停遊戲),它的值也不受影響
fixedUnscaledTime 表示從遊戲開始以來經過的時間,以固定的時間間隔計算,並且不受 timeScale 影響 (只可讀)。
fixedUnscaledTimeAsDouble 與 fixedUnscaledTime 相同,但是是 double 型態 (只可讀)
frameCount 遊戲開始以來的總幀數 (只可讀)
inFixedTimeStep 如果在 fixed time step callback 中將返回 true 例如MonoBehaviour 的 FixedUpdate,否則返回 false 。(只可讀)
maximumDeltaTime 任何給定的幀中 Time.deltaTime 的最大值. 用來限制兩個幀之間的時間(Time.time)增加,以秒為單位。
maximumParticleDeltaTime 在一幀中可以花在更新粒子(particle)的最大時間。如果在一幀中超過這個時間,那麼就會把這個更新分割為多個較小的更新。
realtimeSinceStartup 它返回從APP啟動到當前時間所經過的時間(以秒為單位)。也就是說,它計算了從APP啟動以來的總實際時間,而不僅僅是應用程序在前台運行的時間 (只可讀)
realtimeSinceStartupAsDouble realtimeSinceStartup 相同,但是是 double 型態 (只可讀)
smoothDeltaTime 一個平滑的 Time.deltaTime (只可讀)
time 從APP開始執行到目前這一幀的總時間長,以秒為單位 (只可讀)
timeAsDouble time 相同,但是是 double 型態 (只可讀)
timeScale 時間流逝的縮放程度,可以用在實現慢動作效果,預設為 1.0 。 當為 1.0 時,表示遊戲時間和真實時間同步,如果設為 0.5 則遊戲時間以半速運行。當為 0 時,則時間停止,但是遊戲邏輯(像是 Update 方法仍然會被呼叫)與渲染事件仍然會被觸發。
timeSinceLevelLoad 自從最後一個非附加場景(non-additive scene)載入完成以來的時間 (以秒為單位)
timeSinceLevelLoadAsDouble timeSinceLevelLoad 相同,但是是 double 型態 (只可讀)
unscaledDeltaTime 自上一幀以來經過的時間(以秒為單位),並且不受 Time.timeScale 影響 (只可讀)
unscaledTime 自遊戲開始以來經過的總時間(以秒為單位),這個時間不受 Time.timeScale 的影響
unscaledTimeAsDouble unscaledTimeAsDouble 相同,但是是 double 型態 (只可讀)

Reference:

評論