1. 程式人生 > >Unity中Update,FixedUpdate,LateUpdate的區別

Unity中Update,FixedUpdate,LateUpdate的區別

void FixedUpdate () 固定更新

void Update () 更新

void LateUpdate() 晚於更新

FixedUpdate () 和 Update ()

同:當MonoBehaviour啟用時,其在每一幀被呼叫。都是用來更新的

異:Update()每一幀的時間不固定,即第一幀與第二幀的時間t1和第三幀與第四幀的時間t2不一定相同。FixedUpdate()每幀與每幀之間相差的時間是固定的.

Update受當前渲染的物體影響,這與當前場景中正在被渲染的物體有關(比如人物的面數,個數等),有時快有時慢,幀率會變化,Update被呼叫的時間間隔就會發生變化。但是FixedUpdate則不受幀率的變化影響,它是以固定的時間間隔來被呼叫。

所以一些物理屬性的更新操作應該放在FxiedUpdate中操作,比如Force,Collider,Rigidbody等。外設的操作也是,比如說鍵盤或者滑鼠的輸入輸出Input,因為這樣GameObject的物理表現的更平滑,更接近現實。

FixedUpdate的時間間隔可以在專案設定中更改,Edit->Project Setting->time 找到Fixed timestep。就可以修改了

Update和LateUpdate

LateUpdate是在所有Update函式呼叫後被呼叫。可用於調整指令碼執行順序。例如:當物體在Update裡移動時,跟隨物體的相機可以在LateUpdate裡實現。
Unity後臺主執行緒將 Update LateUpdate 製作成兩個多執行緒 先去執行Update的執行緒,等Update 執行完畢後 在去執行LateUpdate執行緒。
舉個例子,一個宿舍4個人,每個人的起床在update中執行,出發在某個人中的lateupdate執行,這樣就可以保證每個人都起床了才會出發。

因為多個update函式是先後順序是隨機的,所以可能攝像機先update而物體還未移動,而下一幀是若物體先update那麼就會出現瞬移的情況。多數攝像機都要加上LateUpdate,即所有場景內的呼叫結束後再更新攝像機。

比如說:有2個不同的指令碼同時在Update中控制一個物體,那麼當其中一個指令碼改變物體方位、旋轉或者其他引數時,另一個指令碼也在改變這些東西,那麼這個物體的方位、旋轉就會出現一定的反覆。如果還有個物體在Update中跟隨這個物體移動、旋轉的話,那跟隨的物體就會出現抖動。 如果是在LateUpdate中跟隨的話就會只跟隨所有Update執行完後的最後位置、旋轉,這樣就防止了抖動。