【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ビューの例
ゲームを実行してみて、見え方を調整してみてください。
ただ、今の状態だと、Main Cameraはこの視点にずっと静止しているので、ステージを広げたりステージの形を変えたりすると、PlayerがMain Cameraの画角から外れてしまい、映せなくなってしまいます。
つまり、Main CameraがPlayerに追従する仕組みを作ってしまえばいいわけですね。
という事で、早速やってみましょう。
カメラの追従 - Virtual Cameraの場合
まずは、スクリプトを書かない方法でやってみます。
メニュー Window > Package Manager でPackage Managerウィンドウを開きます。
Package Managerウィンドウ
PackagesからUnity Registryを選択
この中にある「Cinemachine」というPackageをインストールしますので、右側に検索スペースがあるので「Cinemachine」で検索します。
検索スペースで「Cinemachine」と検索
検索結果
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を追加
「CM vcam1」というカメラが追加された
このCM vcam1のInspectorビューを見てみます。
何やらMain Cameraとは設定が異なります。
CM vcam1のInspectorビュー
CinemachineVirtualCameraコンポーネント内のFollowが追従するものを設定するところなのですが、None(Transform)となっています。
以前にゲームオブジェクトはTransformを持っている、とお話したことがあると思いますが、追従する対象のTransformをここに設定すればOKです。
設定の仕方は、FollowのNone(Transform)となっている右側の丸い個所をクリックします。
FollowのNone(Transform)となっている右側の丸い個所をクリック
Playerを選択(ダブルクリック)する
FollowにPlayerが選択された
Gameビューは何処を映しているのか分からない状態
さらに追従させるには追加の設定が必要になります。
次にBodyの部分です。
現在プルダウンでTransposerが選択されていますが、ここを3rd Person Followにします。
BodyはTransposerが選択されている
3rd Person Followを選択
Gameビューが変化した
今回は照準を合わせる必要は無いので、Do Nothingを選択します。
Aimは今回必要無いのでDo Nothingにする
ゲームを実行してみましょう。
Gameビュー
そうなんです、追従する時にRotationにあわせて追従しています。
これは予定していた追従ではないですね。
この設定は人型などRotationが動きによって変化しないようなもので使うので、Sphereなどでは使えない設定です。
Soft Zoneを変更する時、ピンクなっている部分が画角外で、色が付いていない部分がカメラに映る部分です。
それでは再度実行してみましょう。
設定を変更します。
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に変更
このサイズは適宜調整してください。
ピンクなっている部分が画角外で、
色が付いていない部分がカメラに映る部分になる
カメラの高さは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と言う名前で新規作成し、作ったスクリプトをアタッチします。
CameraControllerを開いてコードを記述していきます。
Scriptsフォルダ内にCameraControllerスクリプトを作成
Main Cameraに作成したスクリプトをアタッチ
VSが起動したら、コメントを書いて、デフォルトで作成されたStartとUpdateを消します。
このような感じです。
コメントを記述し、StartとUpdateを消す
今回用意するのは、追従するターゲットの位置になります。
今回はPlayerの位置です。
それと、カメラの位置です。
そしたらスクリプトに戻ります。
ところが、ゲームが開始されてUpdate関数が呼ばれると、次の通りになります。
まずはこの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関数を再度記述します。
何故かFPSのゲームの視点のように、Follow CameraがPlayerと同じ位置になっています。
先に簡単にStart関数とUpdate関数について説明します。
Start関数は、ゲームの実行時にUpdate関数の前に一度だけ呼ばれる関数です。
一度取得するゲームオブジェクトやコンポーネントなどは、Start関数の中で取得するのが一般的です。
ゲームの最中はフレーム毎にUpdate関数が繰り返し呼ばれ続けます。
常に変化する変数や、条件によって変化する値や繰り返す処理などはUpdate関数に記述します。
今回のカメラの動きやPlayerの動きなどがこれに該当します。
取り敢えずの簡単な説明になってしまいますが、この2つの動きを覚えておきましょう。
ではスクリプトの続きになります。
Update関数にこのように記述します。
private void Update()
{
// カメラの位置をターゲットの位置にする
followCamera.position = target.position;
}
このようになります。では保存してUnityに戻って、実行してみましょう。
実行時のSceneビューとGameビュー
ゲームの実行前は、このように設定していました。
ゲーム実行前のMain CameraのTransformの設定
ゲーム開始直後の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 void Start()
{
// カメラの位置からターゲットの位置を引く
offset = followCamera.position - target.position;
}このようになります。次に、この取得したoffsetをtargetのPositionに加算します。
このように変更します。
folloeCamera.position = target.position + offset;
このようになります。offsetを足し合わせる









































コメント
コメントを投稿