FPSプレイヤーが顔を傾けたりしゃがんだりしているときに、懐中電灯の位置も同じように変えてみました。
懐中電灯として使うスポットライトは、ピボットである空のゲームオブジェクトの子になっています。カメラの動きに少し遅れてついてくるようにしたいので、プレイヤーの子にはせず、Updateメソッドで位置や回転を入れます。
遅れてくるようにするには、回転をそのまま入れずに、Quaternion.Lerpメソッドを使います。
// 懐中電灯を動かす
void MoveLight(float posY)
{
if (懐中電灯が点灯中)
{
// 懐中電灯にFPSカメラの回転を入れる
flashLight.transform.localRotation = Quaternion.Lerp(flashLight.transform.localRotation, m_Camera.transform.localRotation, 0.6f);
// ピボットにプレイヤーの回転を入れる
flashLightPivot.transform.rotation = Quaternion.Lerp(flashLightPivot.transform.rotation, transform.rotation, 0.6f);
Vector3 pos = transform.position;
pos.y += posY;
// ピボットにプレイヤーの位置を入れる
flashLightPivot.transform.position = pos;
}
}
ピボットに位置を代入するときに、高さを変えられるようにしています。この値は普段は、FPSコントローラーでしゃがむで使うカメラの高さの値にしているので、しゃがみと同時に懐中電灯の高さも上げ下げできます。しゃがんでいないときは0です。
プレイヤーの状態によってこの引数の値を変えられると、いろんな体勢で懐中電灯を使えます。
また、FPSで歩きに合わせて手元を揺れ動かすで懐中電灯のローカル位置に代入する値のx座標に、FPSキャラのカメラを横に傾ける #2でつかう、X方向の頭の位置の値を足すと、リーンにも追従させられました。
Vector3 handBob = m_HandBob.DoHeadBob( // ... // );
handBob.x += leanPosX;
flashLight.transform.localPosition = handBob;