棒を登っているときに、歩いているときのようにカメラを周期的に動かしてみます。
カメラの回転はMouseLookクラスのLookRotation()で行うので、その中で体のY軸の回転と、カメラのX軸の回転にそれぞれ変数を足して置いて、普段は0にしておきます。
FirstPersonControllerクラスのUpdateCameraPosition()でheadBobを更新するときに、棒を登っている時は位置でなく上記の回転値に値を入れるようにします。
else if (m_IsClimbingPole)
{
newCameraPosition = m_Camera.transform.localPosition;
if (m_CharacterController.velocity.magnitude > 0)
{
Vector3 bob = m_HeadBob.GetBob( /* ... */ );
m_MouseLook.tilt_x = bob.y;
m_MouseLook.tilt_y = bob.x;
}
else {
m_MouseLook.tilt_x = 0f;
m_MouseLook.tilt_y = 0f;
}
}
CurveControlledBobクラスのDoHeadBob()では、カメラの初期位置も含めた値が返るので、コピペして初期位置を含めない値を返すメソッドを作りました。引数はDoHeadBob()と同じです。
動く範囲は元のメソッドとは別に設定できるようにしました。
tilt_x/yというのがMouseLookに新しく足した回転値です。縦方向のボブの値(y)を使って縦に回転させたいので、それをx軸の回転値に入れています。棒の上でプレイヤーが動きを止めているときや、棒から降りたときは0にします。