今回は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.1、Recentering 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機能を使えば簡単に実装できます。
こっちはバーチャルパッドで動くようにしたやつ
以上です。