Unityで,プレイヤーを追跡するカメラスクリプトを作成していました.
まぁやっている方はたくさんおられるので説明は略しますが...
で,ゆっくり追従(追尾、補間)するカメラをつくろうとしたら,カメラがガタついてしまいます.
Vector3.Lerp や Vector3.SmoothDampでの補間を利用したものです↓
ちなみに僕は Vector3.SmoothDampでやっています.Lerpよりガタつきが減ったように見えたので.
調べたところ,物理演算とゲームループが同期できていない?(Unity カメラ がたつく,等で調べてください)のが原因の一つかもしれないことが判明.
【2017/10/15追記】Rigidbodyがついているオブジェクト を追跡する際に発生する問題っぽい?
対策1:Update()から移動させる
処理をFixedUpdate()がLateUpdate()に移植する。
どちらが良いかは不明。 RigidbodyをもつObjectを追跡するときはFixedUpdate()がよいのか?
やってみて治ればバンザイ(∩´∀`)∩
対策2:FPSを落とす
ふと,処理速度が速すぎて,追跡しきれてないのでは?と思いFPSを見てみたら300FPSとか普通に出てました.
とりあえずFPS落としてみるかと思い↓等を参考にエディタ上やスクリプト上で落としてみました.
Unityゲーム開発所 - UnityでFPSを設定する方法
…FPS落ちない.上記リンク先によるとビルド後でないと反映されないみたいです.
結局ビルドしてみたらがたつきは治りました.
前もビルドしたら治った案件があったので,一回ビルドして確かめるのもいいかも.
対策3:RigidbodyのInterpolateを見直す
RigidbodyのInterpolateがNoneの場合とそれ以外(Interpolate,Extrapolate)とでがたつきが変わる。Noneにすれば治る場合がある
対策4: スクリプトの実行順番を変更する
追跡対象のGameObjectの移動が、カメラ追跡スクリプトの実行順より遅い場合、
・ カメラスクリプトで追跡→GameObjectが移動
となるので、ガタつく?
結果:よくわからん
前はFPSを弄ったら治ったし、今やってる案件ではFixedUpdate()に放り込んだら治った。よくわからない。以上。