close
Update 函式是在 Unity 中很常見的一個函式,它隸屬於 MonoBehaviour 類別底下,掌管著很重要的功能,為什麼這麼說呢?如果你是製作一個動態性的遊戲,那麼 Update 你絕對不陌生,因為牽扯到物件移動、畫面更新、計時器等等,你就需要它。
我們都知道遊戲是由一幀一幀的畫面所連貫組成的,我們稱之為每秒幀數 (FPS ,Frame per second),Update 的生命週期是從遊戲開始之後,也就是 Awake 和 Start 函式執行完成後,之後每一幀就會叫用一次 Update,每一幀的長度沒有固定,取決於電腦的速度,FPS越高畫面就會越流暢。
Update 還有兩個很像的兄弟,叫做 FixedUpdate 和 LateUpdate,以下來說明三者的不同:
- Update:每一幀執行一次,會因為幀數時間長短不同而被影響,容易造成物件移動延遲、物體碰撞抖動等等的小問題。
- FixedUpdate:每固定時間執行一次,不被幀數時間長短影響,這個特性讓它適合來處理一些物理計算、鋼體屬性、重力和引力等等。
- LateUpdate:每一幀執行一次,會等待所有啟動的 Update 函式執行過後才執行,由於不同腳本的 Update 的執行順序不得而知,若有些變數的改變和更新分別寫在不同腳本的 Update 函式中,可能會發生變數值還沒改變就去做更新的動作,因此將畫面更新之類的方法寫在這裡會比較合適。
- 方法定義:
- 用法:
void Update(){ //要做的事情}void FixedUpdate(){ //要做的事情}void LateUpdate(){ //要做的事情}
- 實作(一):物體移動
using UnityEngine;using System.Collections;
public class CameraLookAt : MonoBehaviour{ //移動量 Vector3 movement = new Vector3(1,0,0);
void Update ()
{
GetComponent<Transform>().Translate(movement);
} void FixedUpdate () { GetComponent<Transform>().Translate(movement);
} void LateUpdate () { GetComponent<Transform>().Translate(movement); } }
- 實作(二): 看出三種 Update 之間的執行順序
using UnityEngine;using System.Collections;
public class CameraLookAt : MonoBehaviour{
void Update ()
{
Debug.Log("Update!");
} void FixedUpdate () { Debug.Log("FixedUpdate!"); } void LateUpdate () { Debug.Log("LateUpdate!"); } }
//執行結果//Update!//FixedUpdate!//LateUpdate!//Update!//FixedUpdate!//LateUpdate!//FixedUpdate!//Update!//LateUpdate
//很明顯可以看出來第二幀到第三幀的時間比第一幀到第二幀的時間長,//因此 Update 延遲了一下子才執行,而 LateUpdate 也因為這樣被延遲//但 FixedUpdate 沒有被影響
- 結語:
- Update 和 LateUpdate 會因為幀數間的時間不同而有執行順序改變的可能性。
- FiexdUpdate 不受幀數間時間長短影響,相對來說是穩定的時間執行。
- FPS 越高,每秒 Update 執行次數越多,以實做(一)的移動例子來看,如果每秒執行40幀,物件每秒就移動40個單位;但若下一秒FPS降到30,物件的移動量足足比上一秒少了10個單位。
- 依照上述說明,如果今天換成對物體施加力量 (AddForce),或是變數值的增減,想想會發生什麼事?
Try it and have fun!
全站熱搜