スタンダードアセットのFPSコントローラーでしゃがめるようにしてみました。
FirstPersonControllerでは、カメラの位置をUpdateCameraPosition()で更新しているので、ここで高さを変えられるようにします。
newCameraPosition.y = /* ... */ + cameraHeight;
newCameraPosition.yに好きな値を足せるようにして、普段はこの値を0にしておきます。
bool m_IsCrouching = false;
bool standUp = true;
Vector3 cameraPos;
[SerializeField] float crouchCameraHeight = 0f;
float cameraHeight = 0f;
float defCameraHeight;
// ---
// Start()
//defCameraHeight = m_Camera.transform.localPosition.y;
// ---
// Update()
if(Input.GetKeyDown(KeyCode.C))
{
if (standUp) m_IsCrouching = true;
standUp = !standUp;
}
// しゃがむ
if (m_IsCrouching)
{
if (!standUp)
{
if (m_Camera.transform.localPosition.y <= crouchCameraHeight)
{
}
else
{
cameraHeight -= 0.02f;
}
}
else
{
//if (m_Camera.transform.localPosition.y >= defCameraHeight)
if (cameraHeight >= 0)
{
m_IsCrouching = false;
cameraHeight = 0f;
}
else
{
cameraHeight += 0.06f;
}
}
}
// ---
// GetInput()
speed = !standUp ? m_WalkSpeed / 2f : speed;
立っているときにCキーを押すとしゃがみます。cameraHeightを小さくしていって、カメラの高さが設定した値より小さくなると止まります。もう一度Cキーを押すとcameraHeightを大きくしていって、0以上になると0に戻します。
カメラが下がっている途中でも、Cキーを押せば立ち上がる動作に変わります。カメラが上がっている途中でCキーを押してもすぐにしゃがむ動作に切り替わります。
歩くスピードはGetInput()の中で変えます。カメラが下がり始めると歩く速さを遅くして、立ち上がり始めたらすぐに元の速さに戻ります。
m_IsCrouchingがfalseのときはしゃがむための処理をしないようにしていますが、falseの時は立ち上がるという風にして、今のカメラの高さがデフォルトより高くなればデフォルトに戻す処理を普段も繰り返すようにすると、歩いている時のカメラの上下の動きに反応して、カメラが小刻みに動いてしまうようです。