テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

【Unity】Cinemachineのカメラ位置や向きを、自分のスクリプトで制御する

Cinemachineを紹介すると「自分のシステムと相性が悪い」や「使い方が難しい」といった意見をよく聞きます。
とは言えCinemachineが提供する「演出用カメラワークへのシームレスな移動」や「めり込み抑制や振動といったエフェクト」、「手ブレ」は使いたい所です。

なので今回は、可能な限り自分でカメラの回転や座標を制御しつつCinemachineの追加機能を使う方法について考えてみます。

 

 

Virtual Cameraを自分で制御したい

Cinemachineは概ね3つの機能で構成されています。後付で様々な機能が追加されていますが、根底はこの3つです。

  • Virtual Cameraの位置を制御するFollowとBody
  • Virtual Cameraの回転を制御するLookAtとAim
  • Virtual Camera同士をブレンドするCinemachine Brainコンポーネント

実際は微妙に違うと言えるかもしれませんが、大体このニュアンスでOKです。

f:id:tsubaki_t1:20180819225322j:plain

要するに、BodyとAimを無効化(Do Nothing)してしまえば、Virtual Cameraの座標・向きの変化は停止します。自分自身でVirtual Cameraを動かしても問題なくなります。

後はVirtual CameraをセットしたGameObjectのTransformを自分の好きなように動かしてやれば良いという訳です。

Virtual Cameraの動きは自分の定義したスクリプトで動かしても、

f:id:tsubaki_t1:20180819225922j:plain

またDoNothing担っている場合でも、Virtual Cameraに設定されているExtensionsは動作します。なお、幾つかのExtensionsはLookAtを要求します。

f:id:tsubaki_t1:20180819230328g:plain

 

Virtual Cameraを特定のオブジェクトと同期させる

Virtual Cameraを特定のオブジェクトと同期させるアプローチについてです。
多分コレは任意のオブジェクトを元に移動させるとか、そんな用途の機能と思われます。要するにPOVです。
もちろんUnityでは「子オブジェクトにする」というアイディアもありますが、階層が深いのは余り良くないです。

www.youtube.com

まずVirtual Cameraを別のオブジェクトと完全に同期させてみます。
特定のオブジェクトをフォローさせたい場合、Followに追跡したいGameObjectをセットしBodyはHard Lock To Target、AimはSame As Follow Targetです。

SameAsFollowTargetのみLookAtではなくFollowを要求しています。多分PostProcessingStack拡張のDOFがAIM依存なのでソレを気にしてるんじゃないかなという気もしますが、どうなんでしょう。

f:id:tsubaki_t1:20180819232611j:plain

 ところでPOV系の動画を見ると自分一発で酔う事があるんですが、自分だけですかね?デッドプール2の逆さまになって銃撃するシーンとか超しんどかった

 

座標は自分で設定したいが向きだけはCinemachineの機能を使いたい

座標は自分の指定した動きをしてもらいたいが、向きだけはCinemachineのComposerを使いたいという場合です。
例えばジブショットのような連続した動きをCinemachineでやらせようと思ったら、地味に面倒くさいですが、向きと座標込でアニメーション作るのも正直面倒くさいので移動はアニメーションやパス、向きはCinemachineにやらせるという話です。

www.youtube.com

考え方は単純で、FollowにAnimationやSplineで動かすオブジェクトを指定し、BodyにHardLockToTargetを指定。LookAtにフォーカスしたい対象を指定してComposerを使うというだけです。

f:id:tsubaki_t1:20180819235824j:plain

コレの良いところは移動中にフォーカスしたい対象を切り替えられる点です。例えば下のGif動画では、移動の途中にフォーカス対象をゆっこからユニティちゃんへ切り替えています。
「移動先を見る」だけならそれ程難しくはないのですが、見せたいものがある場合には結構良いかなという感触です。

f:id:tsubaki_t1:20180820000120g:plain

 

ちゃんとCinemachineの機能に則って動きを作りたい

CinemachineComponentBaseを継承したクラスを作ると、自分のオリジナルCinemachine動作が作れます。

Class CinemachineComponentBase | Package Manager UI website

f:id:tsubaki_t1:20180820002536j:plain