【Unity】FPSで歩きに合わせて手元を揺れ動かす

投稿者: | 2020-05-23

一人称視点で歩いているときに足のステップに合わせて手元を小刻みに動かしてみます。

スタンダードアセットには、キャラクターが歩くのに合わせてカメラを上下左右に揺れ動かすためのCurveControlledBobクラスがあるのでこれを使ってみます。FirstPersonControllerでもカメラを揺れ動かすのに使われています。

CurveControlledBobを使うには、インスタンスを作ってはじめにSetupメソッドを実行します。カメラ用なのか、Setupメソッドの第一引数の型がCameraになっています。これをGameObjectに変えるためにCurveControlledBobを複製してみました。

// FirstPersonController
[SerializeField] GameObject rightArm;
[SerializeField] private CurveControlledBob1 m_HandBob = new CurveControlledBob1();

// ---
// Start()

m_HandBob.Setup(rightArm, m_StepInterval);

// ---
// UpdateCameraPosition()

rightArm.transform.localPosition = m_HandBob.DoHeadBob( /* ... */ );

FirstPersonControllerのUpdateCameraPositionメソッドの中で、プレイヤーが地面に付いて移動しているときに、DoHeadBobメソッドを実行して右手を上下左右に動かします。DoHeadBobの引数は、m_HeadBob.DoHeadBobの引数と同じです。

DoHeadBobを一度に複数回実行するとその分動きが早くなりますが、変数に入れると問題ありません。

Vector3 handBob = m_HandBob.DoHeadBob( /* ... */ );
rightArm.transform.localPosition = handBob;
Debug.Log(handBob);

手の動き方はインスペクタから変えられます。Horizontal/Vertical Bob Rangeで横、縦の移動幅を変えられます。BobcurveはHeadBobのものと同じにします。Verticalto Horizontal Ratioは上下の移動速度に掛けられます。2にすると、左右へは2歩で一周しますが、上下移動の周期は1歩になります。

コメントを残す

メールアドレスが公開されることはありません。