C++幼女先輩

プログラミング成分多め

【UNITY 2020.2.6f1】Cinemachine FreeLookカメラでTPS操作をする。New InputSystemにも対応

Cinemachineとは

UNITYの提供するカメラ制御のコンポーネント

Cinemachineのインストール

PackageManagerよりインストールをする
その後メニューから Cinemachine-Cinemachine FreeLook を選ぶ
シーンに CM FreeLook1というGameObjectが作成されており、CinemachineFreeLookコンポーネントが付いており
MainCameraに、CinemachineBrainコンポーネントが付いている

f:id:murasame-labo:20210307031119p:plain

キャラクターをカメラが追従してほしいので
CinemachineFreeLookのFollowにキャラクターのGameObjectを、LookAtに注視点(キャラの頭とか)を設定する

このまま実行すると、Cinemachineが昔のInputを使っているため、New InputSystem を使っている場合はエラーになる
InputSystemに変更するには、CM FreeLook1 GameObjectにAddComponentで Cinemachine Input Providerスクリプトを付ける
これでNew Input Systemに変更されるのでエラーはなくなる
ただし、現状ではマウスの動きをキャプチャできないので、CinemachineInputProviderのXY Axisに Look Actionを設定する
f:id:murasame-labo:20210307214238p:plain

これで、キャラクターの動きにカメラが追従し、マウスでカメラを回す事ができる

ただし、このままではキャラの向いている方向に動くので
例えばキャラが右を向いている時に上を押すと右に歩き
もちろんそういう操作のゲームもあるが、今回はカメラの向きでキャラが動くように
つまりキャラがどの方向を向いていても上を押すとキャラがカメラからみて奥へ動くようにする

そのために、カメラからみたforwardベクトルとrightベクトルがワールド座標でのベクトルに変換するため
TransformDirectionを使いワールド座標に変換し
それにキー入力のx,zを掛ければ求まる(もちろんy成分は無視する)
また、移動方向を向くためにLookAtを使う
もちろん、キャラ座標で計算したり最適化は出来るがとりあえずいいだろう

            Vector2 m = move.ReadValue<Vector2>();
            // カメラの方向で移動させる
            Vector3 forward = playerCamera.transform.TransformDirection(Vector3.forward);
            Vector3 right = playerCamera.transform.TransformDirection(Vector3.right);
            moveDir = (m.x * right +  m.y * forward) * speed;
            moveDir.y = 0;

            // 進行方向を向く(今のところ補完入れてない)
            transform.LookAt(transform.position + moveDir);

コメントの通り補完は入れていないけど、今後はCharactorControllerを別のアセットに置き換える可能性もあるので
とりあえずここはこれで。

これで、カメラの回転とキャラ移動が思い通りになった

あとは、横に歩いている時に少しずつカメラが回って正面を向くようにするカメラが最近多いので
Cinemachineでも、BindingModeを変更すればそのあたりの挙動かわるようだ(よくわかってない)

f:id:murasame-labo:20210307215936p:plain

とりあえず今までのまとめ(まだゲーム内容決めてないけど)

www.youtube.com