【Unity】Roll a BallのカメラをCinemachineで制御したら結構良い感じになった(と思う)
CinemachineでRoll A Ballのカメラワークをやってみます。
Roll a Ballとカメラワーク
Roll a ballはUnityで多分最も簡単なワークショップの一つです。
ただ簡略化している所が多く(最初に使うべき機能に限定している)、ゲームとしてみると粗が結構多いのも事実。
特にカメラワークは非常に単純すぎる感があります。
そこで今回はRoll A BallのカメラワークをCinemachineのモノに差し替えてみました。
カメラが追跡する対象を指定する
まずは球を追跡するカメラの設定を作ってみます。
Cinemachineのカメラを使用するので、Virtual Cameraを作って対応していきます。
まずCreate Virtual CameraでVirtual Cameraを作成します。
作成したVirtual CameraのFollowにPlayerをセットします。
Follow(及びBody)が有効な場合、Virtual Cameraの座標や回転はFollowで指定したオブジェクトの座標や向きに依存するようになります。
さてBodyのTransposerの初期設定はLook To Target with Upという設定です。
この設定はオブジェクトの後ろにカメラが来るように移動するというモノで、アーマードコアや幾つかのTPS向けゲームの表現に近いのですが(回転は即反映で移動は予測有りバネ式)、Roll A Ballは操作対象のオブジェクトが回転するので相性が悪いです。
カメラの移動設定
カメラの移動設定を作ります。
ココは幾つかオプションがあります。
最も基本となる動作に近いTransposer & World Space
まず最も単純なのが、Transposer と World Spaceの組み合わせです。
単純に相対距離を維持したまま操作対象を追跡します。その際にDampingを0にしておくと、カメラが操作対象を完全にフォローします。Dampingを1にしておくと、少しゆっくり追跡します。
対象の移動先を予測して向きを変える
玉転がしは移動先を見るゲームです。移動先に視点を先読みして視界を確保するのがゲームのストレスを軽減するオプションになりそうです。
なので球の移動方向へ視点を向けてみます。
まず考えたのがLookAtとComposerのLookaheadTimeを使用して移動先に視点を持っていくアプローチですが、やってみると傾きが簡単に入り若干酔いました。
Horizontal/Vertical Dampingを設定して傾き速度を緩和するのも思いましたが、どちらかと言えばカメラごと移動予測方向へ動かしたほうが良さそうです。
なのでBodyのFraming Transposerを指定します。
Framing Transposerは2D用ですが3Dでも使えます。Lookahead Timeを少し高めに設定しておくと、操作対象の移動先が中心になるようにカメラが移動します。
世界の裏側を見せないようにする
Roll A Ballのようにキャラクターを中心位置に置いていると、結構簡単に世界の裏側を見せてしまいます。また世界の端であることが壁以外でアピールされていないため、人によっては壁の向こうになにかあると思って体当たりを繰り返す事があります。私みたいに。
ということで、壁の端に行ったらカメラを止めるようにします。
使用したのはCinemachine Confinerです。
Virtual CameraのAdd Extensionsボタンから追加し、ConfineModeを3Dへ変更、
あとはカメラの動く範囲をColliderで設定するだけです。
Confinerの設定については下の記事をどうぞ
ゲームの開始時に全体像を見せる
最後にステージの全体像を見せるイントロからシームレスにゲーム画面に移行するやつをやってみます。
イントロの部分はTimelineで作ってみます。
まず最初のカメラの動きはすごく単純で、取りたいショットの位置にVirtual Cameraを置いて、後でブレンドしているだけです。
ポイントはTimeline最後のクリップでEase Out Durationを少し上げておく事です。
Ease Out Durationに指定した時間で「現在最もプライオリティの高いカメラ(ゲーム用カメラ)へブレンド」を行ってくれます。
なお、Timeline用のVirtual CameraはDisableでも動作します。
普通にプライオリティの切替してたら結構面倒なので、ステージ演出用のTImelineは通常DisableにしておきTImelineで制御するのが良さそうです。
感想
先日Unityわくわくキャンプ というイベントのお手伝いをさせてもらったのですが、Roll A Ball(はじめてのUnity)で「スクリプトもっと減らせないか」という話題が出たので少しやってみました。
正直Cinemachine使ったほうが操作が多くて面倒な感はあるのですが、コッチを基準にしたほうが最終的にちゃんとしたゲームは作りやすくなるんじゃないか感も。