2015年9月21日 星期一

【Unity】Update和Fixedupdate 物件碰撞的抖動問題

Update:每一個frame更新時會被呼叫。
Fixedupdate:每一個固定時間frame更新時會被呼叫。

Update在每一個frame都需要處理的狀況,例如移動、計時器、按鍵滑鼠判斷等等都會用到,需要特別提出來的地方是,Update在被呼叫的間隔並不固定。
我們可以在Update內把Time.deltaTime印出來看看,可以明顯看到每秒最後一個frame的結束時間並不相同
Update time

再來看看Fixedupdate,在Fixedupdate下印出Time.deltaTime,可以看到顯示時間是相同的。
FixedUpdate time

另外Fixedupdate的更新時間是可調整的,在Edit->Project Settings->Time,Fixed Timestep做數值的更動就可以了。
FixedUpdate time


但如果只是時間間隔上的不同,特地使用Fixedupdate的理由又是什麼?
Unity的官方說明提到,如果遇到有關Rigidbody的情況,必須在Fixedupdate中處理。
這裡拿自己的例子來做說明:
角色透過虛擬搖桿移動,碰到障礙物時使用物體碰撞Collider的方式做阻擋。
test

Update內運作的情況:


Fixedupdate內運作的情況:

希望有看出其中的差別,在Update中做處理時,由於移動與剛體的碰撞判定並不是同步的,所以會造成畫面上所看到的抖動問題,而在Fixedupdate中執行可以解決這個問題。
這是先前碰到過的問題,拿出來分享一下,這次就到這裡。

8 則留言:

  1. 初學不太了解,請問解決方法是指將移動系統(Touch)由Update搬到FixedUpdate嗎?
    感謝!

    回覆刪除
    回覆
    1. 如果移動會處理到物理碰撞的話,是的。

      刪除
  2. Jerrard大,下面兩張圖好像死了。

    回覆刪除
    回覆
    1. 感謝你的提醒,連結失效的問題正在逐步修正中

      刪除
  3. Hi Jerrard,
    Thank you so much for the explanation. But I can't distinguish the difference between Update() and FixUpdate() due to the last two images are still broken.

    回覆刪除
  4. Jerrard大,下面兩張圖好像再次死了

    回覆刪除
  5. 非常好理解的說明 讚讚!!

    回覆刪除

【自製小遊戲】水平思考猜謎(海龜湯)

遊戲連結 海龜湯的玩法是由出題者提出一個難以理解的事件,參與猜題者可以提出任何問題以試圖縮小範圍並找出事件背後真正的原因。但出題者僅能以「是」、「不是」或「沒有關係」來回答問題。 本遊戲蒐集各種論壇、平台的42個題目,提供給想玩海龜湯卻愁找不到題目的你們。 ...