cinemachine

Unity2017のCinemachineをやってみた

こんにちは。Unityエンジニアの新井です。

Unity2017が本リリースされましたね!先駆けて前回は、Unity2017で導入予定だった注目機能の一つ、Timelineを試しました。その中で予告したカメラに特化したCinemachineというアセットを今回は試してみたいと思います。

今回は、正式リリース版のVer. Unity2017.1.0f3を使って進めていきます。

Cinemachineとは

Cine.machine Asset
Cine.machine Asset

被写体のどこを映すか決めて、そのポイントを元にカメラの動きをコントロールしたり、対象物の動きを同期させることなどができるカメラに関するアセットです。
既存のカメラをChinemachineで利用するバーチャルカメラ(CinemachineVirtualCamera)として設定し、ゲーム内にいくつも配置可能です。Timelineとの親和性が高く、イメージとしてはTimelineに置かれたCinemachine TrackのShotClipの位置と長さでショットを撮るような感じです。Cinemachine自体は以前から有償AssetとしてAssetStoreにありましたが、パブリッシャーがUnityTechnologiesになり無償公開となりました。

Cinemachineでできること

  • スクリーンのどの辺に被写体が映ってほしいかコントロール可能
  • 追跡(注目)する箇所の設定(Lookat設定)
  • 自身の移動・位置の同期(Follow設定)
  • 複数のカメラを設置し、カットを切り替えることがものすごく簡単
  • レールを敷いてドリー撮影もできる

Cinemachineの導入

AssetStoreにUnityPackageがあり、verは2.0.1になります。(2017.7.31現在)https://www.assetstore.unity3d.com/jp/#!/content/79898

メモ
以前のVer.を導入していた場合は、一度Cinemachineフォルダを削除して再導入してください。

CinemachineのDocument

こちらが公式のドキュメントのようです。
残念ながら、2017.7.31現在、このDocumentの情報はCinemachine1.x系です。設定項目通りには行かなかったり、そもそも該当の項目が無い(名前が変わった、概念が変わった)ものもあるので、Ver.2.0用に更新が入るまでは、大まかな各機能の概要を掴むという程度に参照すると良いでしょう。

Assetのインポートが完了しますと、UnityメニューにChinemachineが追加されます。
一番基本となる「Create Virtual Camera」を作ってみます。

Virtual Camera
Virtual Camera

ヒエラルキーにバーチャルカメラの「CM vcam1」が追加されるとMainCameraの設定が無効になり、直接コントロールすることができなくなります。
以降は、CM vcam1でカメラを変更する必要があります。

Cinemachine Virtual Cameraの各種設定項目

では、上から順に項目を追ってみます。

Virtual Camera設定
Virtual Camera設定

Priority

表示の優先度。より優先度の高いカメラでショットを映します。優先度の高いカメラが非表示になると、次に高いカメラが表示されます。
ちなみに、ここではまだTimelineにCinemachine Trackは配置していません
ヒエラルキーにある複数のカメラの表示優先順位のPriorityになります。

Priority
Priority
メモ
Timeline配置するとあまりこのPriorityは意味を持ちません。
Timelineでは複数のCinemachine Trackが有った場合、Trackの一番下のものが画面に表示します。
Priority その2
Priority その2

また、Soloボタンを押して強制的にStatusをLiveにして表示テストすることができます。

Solo
Solo

LookAt

注視するTransformを設定できます。全体だけでなく、足元や腰、目や注目させるために仕込んだLookPosなど、子オブジェクトのパーツTransformを注視点設定することが可能です。
特徴は、注視するTransformはその場で移動せず回転して追従します。体は動かさず首だけ動かすようなイメージです。

Look At
Look At

Follow

LookAtではカメラの注視点を設定しましたが、Followは設定したTransformの移動を同期します。
透明なオブジェクトを設定して、移動してレールのような使い方をしたり、キャラの背中を映しつつ、一緒に移動するような使い方が可能です。Transformを設定し、後述する「Body」の設定を行うことで利用できます。

Lens

UnityのCamera設定と同じものです。Field Of View(カメラの視野角)、Near Clip Plane(レンダリングされるもっとも近い場所)、Far Clip Plane(レンダリングされるもっとも遠い場所)が入っています、

AimとBodyとNoise

VirtualCameraのコア機能は大きく分類するとAimBodyNoiseの3つになります。

Aim

LookAtで注視点設定したTransformをどのように追従するかを設定できます。さらに、Hard constraintComposerGroupComposerの3種類があり、今回はメインであるComposerについて説明します。

Aim
Aim

Tracked Object Offset
トラッキングに対するオフセット設定。

Horizontal,Vertical Damping
横,縦方向の減衰時間(秒)の設定。
デフォルトは0.5で、0だと減衰せず即移動します。
また、移動はリニアではなく、初め強くだんだん弱くなるEaseOutになります。
各軸(座標)毎に設定できるので、Xは早く、Yは遅いなど細かい指定が可能です。

ScreenX,Y
左右上下の位置(0-1)。

Dead Zone Width, Height
注視点が入る幅と高さ。
被写体の注視点がこの範囲に入っている場合は、被写体の細かい動きをカメラは無視します。
逆に範囲を超えた場合は、この範囲収まるようにカメラが移動して調整します。

Soft Zone Width, Height
被写体の全体がカメラの中心へと映るようにする範囲。

BiasX,Y
Soft ZoneのX,Y移動。

メモ
 デフォルトのHard constraintは、余韻などを含めず、注視している対象(Transform)が動いたら
Dampingせずそのままダイレクトにカメラの回転になります。

Body

Bodyは、Follow設定したTransformの同期に関する挙動の設定や、追跡の仕方や用途を設定することができます。Orbital TransposerTracked DollyTransposerと3種類から選択が可能です。

ody設定 Orbital Transposer, Tracked Dolly, Transposer
Body設定 Orbital Transposer, Tracked Dolly, Transposer
メモ
Hard constraintではFollow設定されていてもなにもしない状態になります。

Orbital Transposer

FollowしたTransformを軸にカメラを任意に回転させます。回転の入力はUnityのInputManagerにあるものを設定します(デフォルトではMouse X)。LookAt設定と合わせて利用することで常に注視点に向きながらTransformの周りを軌道に沿って回転させることが可能です。設定次第で回転の入力を繰り返すことで回転速度があがり続けるようにすることもできます。

Orbital Transposer
Orbital Transposer

Radius
回転の半径。

Height Offset
高さのオフセット。

X, Y, Z Damping
減衰時間(秒)。

Damping Style
Polar(極座標), Cartesian(直交座標)。

Heading Bias
カメラの横回転(-180〜180)。

X Axis
Followターゲットを軸にした回転(左右)の設定項目。

Value
回転量(読み取り専用)。

MaxSpeed
加速時の最大スピード。

Accel Time
加速時間。低いほど最大速度に達する時間が短い。

DecelTime
加速がなくなってから減速開始までの時間。低いほど減速するタイミングが早くなります。

Input Axis Name
Edit > Project Settings > Input
InputManagerにあるNameを入力することで、該当Inputのタイミングで(対象を軸に)回転量が加算されます。(デフォルトはMouse Xで、マウスの左右位置で加速が行われます)

InputManager
InputManager

Input Axis Value
加速量(読み取り専用)

Recenter To Target Heading
Enabledのチェックを入れると、加速がなくなったら自動的にHeading Bias設定した元のカメラアングルに戻ります。

Recenter Wait Time
戻り始めるまでの待ち時間

Recentering Time
戻る時間(少ないほど早いが、0にしても瞬間移動しない)

Heading Definition
Heading Definitionに関して、挙動の違いが掴めきれないため詳細については割愛させていただきます。
※上記パラメータ群は、デフォルトの設定にあるTarget Forwardの状態で検証しました。

メモ
DocumentのUpdateに今後期待したいです。
所感としてOrbital Transposerをどういった用途で使うのが最適なのか今ひとつ掴みきれません。
Inputを続けることで回転速度が上がるさまは、遊園地のコーヒーカップのような感じです。

Tracked Dolly

カメラのレールをあらかじめ設定しておき、LookAtやFollow設定しておくことで、ターゲットの動きに合わせて自動でレールの上を移動させる設定です。トラッキングするTransform(Follow設定)を追う際に、設定したレール(パス)上をなぞるように移動します。パスの終点まで行った場合は、カメラの移動はストップします。横移動だけでなく、上下も設定可能なのでカメラクレーンのような動きを作ることもできそうです。
パスは、CinemachinePathコンポーネントで指定することができます。CinemachinePathは、ゲームオブジェクトにAddComponentして利用します。

Tracked Dolly
Tracked Dolly
メモ
時短として、Cinemachine > Create Dolly Camera with Track で、Pathが自動で作られてコンポーネント指定された状態で
始められます。
Create Dolly Camera with Track
Create Dolly Camera with Track

Path

CinemachinePathコンポーネントを指定します。
レールの設定自体はヒエラルキーに置いて行う必要がありますが、設定完了したものはヒエラルキーになくても利用することが可能です。CinemachinePath(図CinemachinePath Waypoints の 白丸No.)は、Sceneビュー上で直接移動させたり、Tangent値を入れてカーブを描くことも可能です。

CinemachinePath Waypoints
CinemachinePath Waypoints

Path Position
Pathの位置を指定できます。この後に出てくるAuto DollyEnabledにチェックが入らない場合は、Pathの移動については、こちらを値を変更する必要があります。(そうする場合のメリットを感じないので、Dollyを使う時は、Enabledのチェックは入れると良いでしょう)

Path Offset
パスのオフセット

X,Y,Z Damping
減衰時間(秒)

Camera Up
Default

パスの上下などで斜めになってもカメラは傾かない。(水平を保つ)

Path
パスの上下などで斜めになった場合、カメラは斜めの角度になる。パスで設定したRoll(Z回転)の影響を受ける。

Path No Roll
パスで設定したRollを無視します。その他の挙動はPathと変わらず。

Follow Target, Follow Target No Roll
挙動は、Defaultと変わらず…

Auto Dolly
Enabled
のチェックを入れると、自動でFollowしたターゲットを追跡します。

Search RadiusSteps Per Segment
追跡する半径を指定するものだと思うのですが、何も起きません…(0を入れても、50を入れても挙動が変わらず)
Steps Per Seqmentについても同様で、値を入れても変化を感じられませんでした。

Search Radius 2, Steps Per Segment 8(共にデフォルト値)で進めます。

メモ
Camera UpのFollow TargetとFollow Target No Roll、Auto DollyのSearch Radiusと、Steps Per Segment…
Documentの更新に期待したいと思います。

Transposer

Bodyの3つの設定(Orbital TransposerTracked DollyTransposer)の中で一番基本的かつシンプルで使い勝手も良く利用頻度が高いと思います。Follow Offsetを設定することで、TPSやFPSの視点もこれで可能です。

Transposer
Transposer

Follow Offset
Follow設定した場合は、カメラのTransformはFollowしたTransformになるので、各座標のオフセットを設定して映したい位置を調整します。

X,Y,Z Damping
追従する減衰時間(秒)を設定します。

Binding Mode
カメラの関連付けのモードが4つあり、それぞれの特徴に合わせて利用します。以下の挙動については、LookAtに注視点となるオブジェクトを設定している時の状態になります。

Lock To Target On Assign
ターゲットオブジェクト(LookAt)にカメラの状態を保持します。ターゲットが各軸で回転した場合も、カメラの位置の変更はありません。

Lock To Target With World Up
ターゲットオブジェクト(LookAt)にカメラの状態を保持します。ターゲットが各軸で回転した場合、カメラの位置の変更が行われます。

Lock To Target No Roll
ターゲットオブジェクト(LookAt)のforwardの位置と向きにカメラを保持します。ただし、ターゲットのRoll(Z軸回転)は無視します。

Lock To Target
ターゲットオブジェクト(LookAt)のforwardの位置と向きにカメラを保持します。ターゲットのRoll(Z軸回転)も合わせて回転します。

World Space
Lock To Target With World Upと挙動は同じように感じられました。

Noise

AimやBodyの追跡に対応したカメラの画にパーリンノイズを利用した手ブレ効果を設定することができます。CreateAssetボタンからSettingsファイルを作成し、より細かく位置と回転を設定することや、設定ファイルを保存をすることが可能です。

Noise
Noise
メモ
SettingsファイルはScriptableObjectです。

Amplitude Gain
振動幅

Frequency Gain
周波数(振動数)

Cinemachineを利用してサンプルを作成してみる

前回つくったユニティちゃんがただまっすぐ走るだけのシーンに、AimBodyNoiseを利用してもう少し凝ったものにしたいと思います。

ユニティちゃん 走る
ユニティちゃん 走る

Track作成の流れ

  • ユニティちゃんを移動させる
  • 動かしたいカメラを設定(合計6台のVirtualCameraを設置します)

ユニティちゃんの移動

サンプルでは、シークバーで移動する前回のPlayableTrackの移動距離(終点)を調整して流用していますが、移動は、UpdateやCoroutineなどを使ってもよいと思います。
ちなみに、500フレーム(約8.333…秒)かけて(0,0,0)の位置から(0,0,20)まで移動させています。

 

TimelineのWrapMode

TimelineにAddされているPlayable DirectorWrap ModeHoldにします。Noneでは、再生が終わったら先頭にシークバーが戻ってしまいます。(Loopは文字通り、再生を繰り返しますので今回やりたい方向はHoldになります)

Wrap Mode Hold
Wrap Mode Hold

VirtualCameraの設置

Cinemachineの要である、VirtualCameraを設定していきます。ざっくりと以下の図のようにカメラを設置していきたいと思います。

VirtualCameraの配置
VirtualCameraの配置

各カメラの主要設定と動きについて

CM vcam1 CM vcam2 CM vcam3
Look At: LookPos
Follow: LookPos
Aim: Composer
Body: Transposer
Follow Offsets: (0,0,-5)
Look At: LookPos
Follow: LookPos
Aim: Composer
Body: Tracked Dolly (Dolly Track1)
Auto Dolly: Enabled true
Look At: LookPos
Follow: None
Aim: Composer
Body: Hard Constraint
CM vcam4 CM vcam5 CM vcam6
Look At: L_knee
Follow: None
Lens Dutch: -20
Aim: Composer
Body: Hard Constraint
Look At: _body
Follow: None
Lens Dutch: 20
Aim: Composer
Tracked Offsets: (0,-2.21,0)
Body: Hard Constraint
Priority: 11
Look At: Locator_UpperBody
Follow: None
Aim: Composer
Body: Hard Constraint

Timelineの流れと各カメラの動き

各カメラの動きと流れ
各カメラの動きと流れ

完成Timeline

こんな感じになりました。一つのCinemachieTrackのみなので見た目もシンプルです。

完成Timeline
完成Timeline

VirtualCamera以外のカメラ

Cinemachineには、VirtualCamera以外にも別のカメラがいくつかあります。

その他のカメラ
その他のカメラ

FreeLookカメラは画面をドラッグすることでカメラを動かすことが細かく設定できそうです。
State-DrivenカメラClearShot VirtualCamera、共に子階層にカメラを設定しコントロールするマネージャのような仕組みで、State-DrivenはAnimatorを設定することができ、ClearShotは、「キメ」のショットのカメラを動的かつ最適に変更することができるようです。

また、スクリプトでの制御や動的にバインドさせる方法や、Post-processingなどについても検証の余地が大いにあります。アニメーションに限らず、シーケンサーとして使用することで初期のFlashタイムラインの使い方のように、フレームに処理を書いて処理が終了したら次のフレームに進むというようなやり方も工夫次第でできそうです。

オフィシャルの正式な情報もなく、手探りでの検証でなかなかのボリュームにもなりましたが、以上Cinemachineの検証結果でした。

引き続きTimelineやCinemachineの使い方や可能性について検証していきたいと思います。

関連

Unity2017のTimelineをやってみた

Unity2017 イントロダクション