Raspberlyのブログ

Raspberlyのブログ

Unityネタをメインとした技術系ブログです。にゃんこ大戦争や日常なども。そろそろブログタイトル決めたい

【Unity】入力がなくなったらカメラが定位置まで戻るカメラワークを作る【Cinemachine + Input System】

今回はUnityネタをやっていきます。
UnityのCinemachineとInputSystemを使って、
プレイヤーの入力がなければカメラが定位置まで戻るカメラワークを作成します。


見下ろし視点のゲームで使うことを想定しています。

 

挙動としてはリメイク前のバイオハザード4とかに近いです。

 

 

 

開発環境

Unity 2021.3.12f1

Cinemachine ver2.8.9

Input System ver1.4.4

 

 

 

パッケージのインストール

Unity Package ManagerからCinemachineとInput Systemをインストールしておきます。

 

ステージの作成

最初に簡単なステージを作ります。
床になるPlaneとキャラクターを配置します。
これはなんでもいいですが、今回はSDユニティちゃんを使用します。

 

 

基本的なカメラの設定

Virtual Cameraの作成

シーン内にVirtual Cameraを作成します。
Create/CInemachine/VirtualCameraで作成。

 

Inspectorから、BodyをFraming Transporserに、AimをPOVに設定。

 

Input Systemの入力を有効にしたいので、Add Input Providerを押します。

すると、Cinemachine Input Providerというコンポーネントがアタッチされます。
Input Actionsはデフォルトのやつをそのまま使います。

 

 

最後に、追従対象のオブジェクトを設定します。
FollowにSDユニティちゃんを設定。

 

 

これで基本的なカメラの挙動ができました。
マウス、およびゲームパッドの右スティックでカメラが回転します。

 

 

 

カメラの調整

ここは好みですが、今回は見下ろし視点のゲームを想定しているので、
カメラの動く範囲を制限していきます。

(必要ないのなら飛ばしていいです)

位置設定

SDユニティちゃんの場合、カメラの中央を頭にしたいのでオフセットのYを1にします。
(これはオフセットの値を変えるよりも、Virtual Cameraが参照する用のGameObjectをキャラクターの子に持たせて調整した方がいいかも)

 

Cameraとの距離も少し短くします。

 

 

角度制限

カメラを回転する角度を制限します。
上下の角度は20~70度まで、左右の角度は-40~40度までとします。

 

 

ここまででゲームを実行するとこんな感じ

 

 

Recenteringの設定

ここがこの記事のキモ
視点操作(入力)がなくなったら、一定の角度にカメラが戻るようにします

 

この機能自体は、Recenteringという名前でCinemachineに用意されています。
InspectorビューのAimから、Vertical RecenteringとHorizontal Recenteringを有効にし、
Wait Timeを0.1Recentering Timeを0.5にします。

 

Wait Timeは入力がなくなってからRecenteringを開始するまでの時間、
Recentering TimeはRecenteringを終了するまでの時間です。

上の例だと、入力がなくなってから0.1秒後に、0.5秒かけて定位置までカメラを戻ります。

 

 

中央角度の設定

一見よさそうに見えますが、Recenteringする角度がよくないです。
具体的には上下方向の中央角度が20度になっています。
これはデフォルトの中央角度が0であり、一番近い20が中央とされてしまうためです。

 

上下の回転角度は20~70度なので、45度を中央角度に調整します。
InspectorのAimから、Recenter TargetをLook At Target Forwardに設定。
これはLookAtに設定したTransformの正面を中心角度にするという設定です。

 

次にLookAtに設定する用の空のGameObjectを作成します。
(ワールド座標が参照されるので、プレイヤーのキャラクターの子にしない方がいい)

角度Xを45に設定。

これを、CinemachineVirtualCameraのLookAtに設定。

 

これで完成です。
入力がなくなったら、カメラが定位置まで戻るようになりました。

 

 

まとめ

CinemachineとInput Systemを使って、プレイヤーの入力がなければカメラが定位置まで戻るカメラワークを作成しました。
Recentering機能を使えば簡単に実装できます。

 

 

こっちはバーチャルパッドで動くようにしたやつ

 

 

 

以上です。