黑魂復刻遊戲的攝像機抖動問題——Unity隨手記
阿新 • • 發佈:2021-06-16
今天實現的內容:
問題產生的原因
在我們的程式碼中,攝像機位移使用了SmoothDamp,但是旋轉卻是直接尤拉角賦值,這導致了攝影機位置還沒有調整完,旋轉就已經到位了。想象一下這個過程,攝像機的視線中心在旋轉時會偏移角色頸椎位置,這就產生了抖動。
// 攝像機遊戲物件的移動和旋轉 cameraGO.transform.eulerAngles = this.transform.eulerAngles;
通過完全固定攝像機每幀的指向解決問題
通過使用LookAt,在每一幀將攝像機指向到cameraHandle的transform,我們就能解決問題,這是最簡單的辦法。
// 攝像機遊戲物件的移動和旋轉 cameraGO.transform.LookAt(cameraHandle.transform);
可能出現的運用RootMotion動畫晃動問題
當我們運用上述解決方案以後,可能會出現運用了RootMotion的動畫播放時出現晃動的問題,這個問題可能來自兩處。
1.Animator的動畫更新速率問題,我們的動畫機是可以選擇何種更新模式的,normal意味著和Update一起更新,根據情況我們選擇Animator Physics。
2.該遊戲動畫Root Motion的訊號問題,Root Motion可能會有雜波,我們可以用一些手段平滑掉。以下方案將上一幀的訊號與當前幀的訊號相加再除以2。
// 更新m_deltaPos為動畫機的Root Motion 之所以用累加是因為物理幀和動畫幀不一樣 在物理幀的最後會將m_deltaPos清零 // 加上上一幀的再除以2.0是為了平滑 m_deltaPos += (m_deltaPos + (Vector3)_deltaPos) / 2.0f;