【Unity】チュートリアルの「Roll a Ball」をやってみる話 #5

記事をご覧いただき、誠に有難うございます。

投稿主の無能です。

今回は、カメラの調整とカメラ用のスクリプトを作成したいと思います。


カメラの調整

カメラのTransformを調整して、Gameビューの見た目を整えていきます。

今のGameビューはこんな感じです。

今のGameビュー

カメラが横から写しているので、PlayerとWallしか見えません。
しかもゲームを実行したら、PlayerがWallに隠れてしまうので、操作しても分かりません。

このGameビューがゲーム実行時の画面、つまりゲームプレイヤーの視点になるので、何が何だか分からないゲームは、イコールつまらない、に繋がります。

ではMain CameraのTransformをいじって、見やすい角度にしてみます。

Main CameraのTransformをいじる

今回のチュートリアルの場合は、Main CameraをPlayerやGroundなどのゲームステージを見下ろせる形に設定すると見やすそうです。

ではそのような視点になるように、Gameビューで見ながらTransformをいじります。
こちらがTransformの設定例です。

Main CameraのTransformの設定例

Gameビューはこのような形になります。

Gameビューの例

これでゲームステージ全体が見えるようになりました。
ゲームを実行してみて、見え方を調整してみてください。

ただ、今の状態だと、Main Cameraはこの視点にずっと静止しているので、ステージを広げたりステージの形を変えたりすると、PlayerがMain Cameraの画角から外れてしまい、映せなくなってしまいます。

つまり、Main CameraがPlayerに追従する仕組みを作ってしまえばいいわけですね。

という事で、早速やってみましょう。

カメラの追従 - Virtual Cameraの場合

まずは、スクリプトを書かない方法でやってみます。

メニュー Window > Package Manager でPackage Managerウィンドウを開きます。

Package Managerウィンドウ

ウィンドウ上部の左側にあるPackagesからUnity Registryを選択します。

PackagesからUnity Registryを選択

この中にある「Cinemachine」というPackageをインストールしますので、右側に検索スペースがあるので「Cinemachine」で検索します。

検索スペースで「Cinemachine」と検索
検索結果

そのまま、右下にあるInstallボタンを押下してインストールします。

Installボタンを押下してインストール
インストール中
インストール完了

インストールが完了したら、Package Managerウィンドウは閉じてください。

これで「Virtual Camera」というものが使えるようになりました。

Virtual Cameraはとても多機能なカメラで、この機能だけで追従するカメラが作成できてしまいます。
ではどのようにするのか、実際に使ってみましょう。

Virtual Cameraでカメラが追従する仕組みを作る

Game ObjectにCinemachineが追加されたので追加します。

メニュー Game Object > Cinemachine > Virtual Camera でVirtual Cameraを追加します。

メニュー Game Object > Cinemachine > Virtual Camera でVirtual Cameraを追加

するとHierarchyビューに「CM vcam1」というカメラが追加されます。

「CM vcam1」というカメラが追加された

このCM vcam1のInspectorビューを見てみます。
何やらMain Cameraとは設定が異なります。

CM vcam1のInspectorビュー

まずは追従する対象を設定します。

CinemachineVirtualCameraコンポーネント内のFollowが追従するものを設定するところなのですが、None(Transform)となっています。

以前にゲームオブジェクトはTransformを持っている、とお話したことがあると思いますが、追従する対象のTransformをここに設定すればOKです。

設定の仕方は、FollowのNone(Transform)となっている右側の丸い個所をクリックします。

FollowのNone(Transform)となっている右側の丸い個所をクリック

すると選択ウィンドウが表示されるので、Playerを選択(ダブルクリック)します。

Playerを選択(ダブルクリック)する

FollowにPlayerが選択されました。

FollowにPlayerが選択された

しかし、Gameビューは何処を映しているのか分からない状態です。

Gameビューは何処を映しているのか分からない状態

さらに追従させるには追加の設定が必要になります。

次にBodyの部分です。
現在プルダウンでTransposerが選択されていますが、ここを3rd Person Followにします。

BodyはTransposerが選択されている
3rd Person Followを選択

3rd Person FollowにするとGameビューが変化しました。

Gameビューが変化した

次にAimを設定します。
今回は照準を合わせる必要は無いので、Do Nothingを選択します。

Aimは今回必要無いのでDo Nothingにする

これで一通り設定してみました。
ゲームを実行してみましょう。

Gameビュー

あ、あれ…?画面がグルグルしてる…

そうなんです、追従する時にRotationにあわせて追従しています。
これは予定していた追従ではないですね。

この設定は人型などRotationが動きによって変化しないようなもので使うので、Sphereなどでは使えない設定です。

設定を変更します。

BodyをFraming Transposerにします。
そして、Soft Zone Widthを0.7に、Soft Zone Heightを0.9に変更します。

BodyをFraming Transposerにし、
Soft Zone Widthを0.7に、Soft Zone Heightを0.9に変更

Soft Zoneを変更する時、ピンクなっている部分が画角外で、色が付いていない部分がカメラに映る部分です。

このサイズは適宜調整してください。

ピンクなっている部分が画角外で、
色が付いていない部分がカメラに映る部分になる

カメラの高さはLensにあるVertical FOVで設定できます。

カメラの高さはLensにあるVertical FOVで設定できる

それでは再度実行してみましょう。

Gameビュー

やった!カメラが追従してくれるようになりました!

カメラが追従する時、僅かに遅れて追従するのが気になる、という方も居るかと思います。
そんな時は、Bodyの各軸のDampingを調整してください。

Bodyの各軸のDampingを調整する

デフォルトでは人間がカメラを使う時のような感じが出ていますので、ご自身の好みで調整してください。

その他Cinemachineは多くの機能を持っていますが、無能はあまり機能を使えていません…
ですのでCinemachineの説明はこの辺りで終わりになりますが、興味のある方は使い方を掘り下げていってください。
Unity Japan公式のYoutube動画でも説明が出ています。

次はスクリプトでのカメラ制御になります。

スクリプトからカメラを動かす

次に、スクリプトでカメラを追従させたいと思います。
※Cinemachineは削除しています。
(CM vcam1の削除とMain CameraのCinemachineBrainをRemove Componentする)

まずはカメラのスクリプトを作成します。
Scriptsフォルダ内にCameraControllerと言う名前で新規作成し、作ったスクリプトをアタッチします。

Scriptsフォルダ内にCameraControllerスクリプトを作成

Main Cameraに作成したスクリプトをアタッチ

CameraControllerを開いてコードを記述していきます。

VSが起動したら、コメントを書いて、デフォルトで作成されたStartとUpdateを消します。
このような感じです。

コメントを記述し、StartとUpdateを消す

今回用意するのは、追従するターゲットの位置になります。
今回はPlayerの位置です。

それと、カメラの位置です。

まずはこの2つを用意します。

  public Transform target;
  public TransForm followCamera;
  
こんな感じです。


Unityに戻って、この2つのオブジェクトをアタッチしましょう。

先程CameraControllerスクリプトをアタッチしたので、targetとFollow Cameraが追加されています。
targetにPlayerを、Follow CameraにMain Cameraをそれぞれアタッチします。

このようになります。

targetにPlayerを、Follow CameraにMain Cameraをそれぞれアタッチする

そしたらスクリプトに戻ります。

次は先程消したUpdate関数を再度記述します。

先に簡単にStart関数とUpdate関数について説明します。

Start関数は、ゲームの実行時にUpdate関数の前に一度だけ呼ばれる関数です。
一度取得するゲームオブジェクトやコンポーネントなどは、Start関数の中で取得するのが一般的です。

ゲームの最中はフレーム毎にUpdate関数が繰り返し呼ばれ続けます。
常に変化する変数や、条件によって変化する値や繰り返す処理などはUpdate関数に記述します。
今回のカメラの動きやPlayerの動きなどがこれに該当します。

取り敢えずの簡単な説明になってしまいますが、この2つの動きを覚えておきましょう。

ではスクリプトの続きになります。

Update関数にこのように記述します。

private void Update()
    {
        // カメラの位置をターゲットの位置にする
        followCamera.position = target.position;
    }
このようになります。


では保存してUnityに戻って、実行してみましょう。

実行時のSceneビューとGameビュー

何故かFPSのゲームの視点のように、Follow CameraがPlayerと同じ位置になっています。

ゲームの実行前は、このように設定していました。

ゲーム実行前のMain CameraのTransformの設定

ところが、ゲームが開始されてUpdate関数が呼ばれると、次の通りになります。

ゲーム開始直後のMain CameraのTransform

これは、先程スクリプトに記述したUpdate関数の中で、followCameraの(Transformの)Positionと、targetの(Transformの)Positionが同じ位置になるように記述しているからです。

ではどうやって、最初に設定したMain CameraのPositionを維持するのかと言うと、新たにVector3というものを使います。

Vector3はこのように説明があります。
引用元:https://docs.unity3d.com/ja/530/ScriptReference/Vector3.html

後半の「一般的なベクトル演算を行うための関数が含まれています。」は、今回使わないのでスルーします。

前半の「この構造体は Unity 全体の 3D での位置や方向のために使用されています。」は、何となく感覚的にお分かりいただけるかと思います。

PlayerControlloerで記述した、AddForceのxとzが、力を加えるベクトルとなって働いています。

今回はVector3を使って、followCameraとtargetの位置を取得します。

CameraControllerスクリプトに戻って、変数の部分にこのように追記します。

private Vector3 offset;
このようになります。

Vector3を追記

先程消したStart関数を再度記述し、Start関数内にこのように記述します。

    private void Start()
    {
        // カメラの位置からターゲットの位置を引く
        offset = followCamera.position - target.position;
    }
このようになります。


次に、この取得したoffsetをtargetのPositionに加算します。
このように変更します。

folloeCamera.position = target.position + offset;
このようになります。

offsetを足し合わせる

保存してUnityに戻って、実行してみましょう。

Gameビュー

これでカメラが理想通りの追従をしてくれました!

Cinemachineもありボリュームが大きかったですね。
お疲れさまでした。

今日はここまで。

まとめ

本記事では
  • Main Cameraの位置を調整した
  • Cinemachineをインストールしてつかってみた
  • CameraControllerスクリプトでカメラを追従するようにした
という事を行いました。

次は、Wallにぶつかった時のスクリプトを追加することと、今回までに書いたスクリプトを少し修正していきたいと思います。

本記事もご覧頂き、誠に有難うございます。
ではまた。



コメント