テラシュールブログ

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

【Unity】Roll a BallのカメラをCinemachineで制御したら結構良い感じになった(と思う)

f:id:tsubaki_t1:20180809222952j:plain

CinemachineでRoll A Ballのカメラワークをやってみます。

 

 

Roll a Ballとカメラワーク

Roll a ballはUnityで多分最も簡単なワークショップの一つです。
ただ簡略化している所が多く(最初に使うべき機能に限定している)、ゲームとしてみると粗が結構多いのも事実。
特にカメラワークは非常に単純すぎる感があります。

そこで今回はRoll A BallのカメラワークをCinemachineのモノに差し替えてみました。

f:id:tsubaki_t1:20180809223516g:plain

 

カメラが追跡する対象を指定する

まずは球を追跡するカメラの設定を作ってみます。
Cinemachineのカメラを使用するので、Virtual Cameraを作って対応していきます。

まずCreate Virtual CameraでVirtual Cameraを作成します。

f:id:tsubaki_t1:20180809223856j:plain

作成したVirtual CameraのFollowにPlayerをセットします。
Follow(及びBody)が有効な場合、Virtual Cameraの座標や回転はFollowで指定したオブジェクトの座標や向きに依存するようになります。

f:id:tsubaki_t1:20180809224208j:plain

さてBodyのTransposerの初期設定はLook To Target with Upという設定です。
この設定はオブジェクトの後ろにカメラが来るように移動するというモノで、アーマードコアや幾つかのTPS向けゲームの表現に近いのですが(回転は即反映で移動は予測有りバネ式)、Roll A Ballは操作対象のオブジェクトが回転するので相性が悪いです。

f:id:tsubaki_t1:20180809230340g:plain

 

カメラの移動設定

カメラの移動設定を作ります。
ココは幾つかオプションがあります。

最も基本となる動作に近いTransposer & World Space

まず最も単純なのが、Transposer と World Spaceの組み合わせです。
単純に相対距離を維持したまま操作対象を追跡します。その際にDampingを0にしておくと、カメラが操作対象を完全にフォローします。Dampingを1にしておくと、少しゆっくり追跡します。

f:id:tsubaki_t1:20180809230912j:plain

 

対象の移動先を予測して向きを変える

玉転がしは移動先を見るゲームです。移動先に視点を先読みして視界を確保するのがゲームのストレスを軽減するオプションになりそうです。

なので球の移動方向へ視点を向けてみます。

まず考えたのがLookAtとComposerのLookaheadTimeを使用して移動先に視点を持っていくアプローチですが、やってみると傾きが簡単に入り若干酔いました。
Horizontal/Vertical Dampingを設定して傾き速度を緩和するのも思いましたが、どちらかと言えばカメラごと移動予測方向へ動かしたほうが良さそうです。

f:id:tsubaki_t1:20180809231721g:plain

なのでBodyのFraming Transposerを指定します。
Framing Transposerは2D用ですが3Dでも使えます。Lookahead Timeを少し高めに設定しておくと、操作対象の移動先が中心になるようにカメラが移動します。

f:id:tsubaki_t1:20180809232903j:plain

f:id:tsubaki_t1:20180809232530g:plain

 

世界の裏側を見せないようにする

Roll A Ballのようにキャラクターを中心位置に置いていると、結構簡単に世界の裏側を見せてしまいます。また世界の端であることが壁以外でアピールされていないため、人によっては壁の向こうになにかあると思って体当たりを繰り返す事があります。私みたいに。

ということで、壁の端に行ったらカメラを止めるようにします。

使用したのはCinemachine Confinerです。
Virtual CameraのAdd Extensionsボタンから追加し、ConfineModeを3Dへ変更、

あとはカメラの動く範囲をColliderで設定するだけです。

f:id:tsubaki_t1:20180809233626j:plain

f:id:tsubaki_t1:20180809233949g:plain

Confinerの設定については下の記事をどうぞ

tsubakit1.hateblo.jp

ゲームの開始時に全体像を見せる

最後にステージの全体像を見せるイントロからシームレスにゲーム画面に移行するやつをやってみます。

f:id:tsubaki_t1:20180809234650g:plain

イントロの部分はTimelineで作ってみます。
まず最初のカメラの動きはすごく単純で、取りたいショットの位置にVirtual Cameraを置いて、後でブレンドしているだけです。

f:id:tsubaki_t1:20180809235031j:plain

ポイントはTimeline最後のクリップでEase Out Durationを少し上げておく事です。
Ease Out Durationに指定した時間で「現在最もプライオリティの高いカメラ(ゲーム用カメラ)へブレンド」を行ってくれます。

f:id:tsubaki_t1:20180809235128j:plain

なお、Timeline用のVirtual CameraはDisableでも動作します。

普通にプライオリティの切替してたら結構面倒なので、ステージ演出用のTImelineは通常DisableにしておきTImelineで制御するのが良さそうです。

f:id:tsubaki_t1:20180809235554j:plain

 

感想

先日Unityわくわくキャンプ というイベントのお手伝いをさせてもらったのですが、Roll A Ball(はじめてのUnity)で「スクリプトもっと減らせないか」という話題が出たので少しやってみました。

正直Cinemachine使ったほうが操作が多くて面倒な感はあるのですが、コッチを基準にしたほうが最終的にちゃんとしたゲームは作りやすくなるんじゃないか感も。