[UNITY] Cinemachine 被写体のカクつき、別カメラへの遷移時の回転

08-14,2022

UNITYの、Cinemachine機能における2つの問題を抱えていました。


・1つは、被写体のカクつき。

主にプレーヤーオブジェクトで、ジャンプしたり、カメラ傍で移動したりすると、
プレーヤーだけがカクカクして映る現象。
特徴としては、通常のカメラでは発生しないという点です。

原因

ネットで調べると、
Chinemachineがupdate内で更新を行っているのに対し、
プレーヤーがFixedUpdate内で更新されているのが原因らしいというのが出てきました。

私の場合は、プレーヤーオブジェクトに対し、
Fixeddpdate内で、RigidbodyのVelocityに値を与えている構造でした。

解決策

ネットでは、以下の3つが解決策として出てきます。

・同じUpdate内ですべてをすます
・FixedUpdateの間隔を小さくする
・Rigidbody内のInterpolate設定をInterpolateにする

ところが、私の場合は、
プレーヤーオブジェクトのRigidBody内のInterpolate設定を、
既に[Interpolate]にしていました。

そこで、これを試しに[None]にすると、
なんと、解決してしまいました。


Interpolate設定って、確か、物理演算のすり抜けを防止するために、
演算の割り込み間隔をあげるものだったような・・・。
私の場合はそれが逆に、Cinemachineとの更新タイミングのズレを
生んでいたのかも。

しかし、Interpolateが必要な、たとえばレースゲームとかの場合、
困ることになりそうですが・・・ひとまず今回はこれで解決しました。


・Cinemachineの別カメラへの遷移時の問題

Aカメラ→Bカメラへ遷移する際、
Cinemachineは、この2つのブレンドを自動的に補完します。

しかし、その補完の開始地点は、
前回の遷移直前のカメラの位置へと戻るというもの。

A→ 被写体 ←B

というカメラ構造が常に固定されたようなケースでは、問題ありませんが、

A・B→ 被写体

というカメラ構造で、AとBが、移動・回転するようなケースだと
A→Bの遷移時、無駄な回転や移動が行われ、思ったような挙動になりません。

これは、片方のカメラがオフになった時、
その位置にずっと留まり続け、
再びオンになった時、その位置から補完が開始されることによって起こる弊害です。


希望としては、
再びオンになった時、もう一方のカメラと同じ位置や角度から
スタートして欲しいというケースです。

どんな時に、このケースが発生するかというと、
たぶん、Target Group cameraと、Free Look Camera の切り替えを行う際に、
この問題が最も多く発生すると思われます。

私の場合もこれでした。

・解決方法

最初はスクリプトで、
切り替え後に、オフになっていたカメラの位置を、オンになっていたカメラと
同じ位置と角度になるようにしようとしましたが、
Cinemachineのスクリプト制御は独特のようでしたので諦め、
色々と調べていると、
「遷移時、OFFからONになった際、一方のカメラの位置へ、強制的に移動する」
というプロパティが存在することを発見しました。

Transitions項目の Inherit Position というプロパティです。
これにチェックを入れると、そうなります。

Unity公式には、
この Virtual Camera がライブになった時に、位置を強制的に現在の Unity カメラの位置と同じにし、Virtual Camera がその遅延 (Damping) を適用できるようにすることで、ブレンドの実行を可能にします。」
と書かれていました。

これでほぼ解決しました。

ただし、これは、位置だけのようで、
角度は補完されてしまうかもしれません。