曲がり角から覗き見るように、一人称視点のプレイヤーのカメラを横に傾けます。今回はカメラの回転だけをやってみました。
Qキーで左、Eキーで右にリーンします。FPSコントローラーでカメラの回転をMouseLookクラスのLookRotation()で行うのでここに追記します。localRotationでZ軸に沿って回転させますが、カメラの縦回転を制限する処理のせいか素直に回転しないので、ブロックの最後に記述しました。
// リーン
Vector3 e = camera.localRotation.eulerAngles;
e.z = leanAmount;
camera.localRotation = Quaternion.Euler(e);
キー入力はFirstPersonControllerクラスで受け取ります。まずはQ,EキーのGetKeyDown/Upの4つを使いました。素早く入力するとDownとUpが同じフレームでtrueになることもあるようです。
今回は「カメラを左に傾ける」「右に傾ける」「左から戻す」「右から戻す」「何もしない」の5つの状態から、4つのキー入力の組み合わせによって、他の状態へ遷移させてみました。
そのためにこれらの状態ごとにキー入力と遷移の決定表を書いて遷移の条件を決めました。
// リーン
bool eD = Input.GetKeyDown(KeyCode.E);
bool eU = Input.GetKeyUp(KeyCode.E);
bool eG = Input.GetKey(KeyCode.E);
bool qD = Input.GetKeyDown(KeyCode.Q);
bool qU = Input.GetKeyUp(KeyCode.Q);
bool qG = Input.GetKey(KeyCode.Q);
// 何もしていない
if (lean == 0)
{
// 右へ
if (!eU && eD && !(!qU && qD))
{
lean = 3;
}
// 左へ
if (qD && !qU)
{
lean = 1;
}
}
// 左へ移動
else if (lean == 1)
{
m_MouseLook.leanAmount += 40f * Time.deltaTime;
/*
if (m_MouseLook.leanAmount >= 0)
{
m_MouseLook.leanAmount += 30f * Time.deltaTime;
}
else {
m_MouseLook.leanAmount += 80f * Time.deltaTime;
}*/
// 傾きを止める
if (m_MouseLook.leanAmount >= 20f)
{
m_MouseLook.leanAmount = 20f;
}
// 右へ
if (!eU && eD)
{
lean = 3;
}
// 左から戻るへ
if (qU && !(!eU && eD))
{
// 右へ
if (eG)
{
lean = 3;
}
// 左から戻るへ
else if (m_MouseLook.leanAmount >= 0)
{
lean = 2;
}
// 右から戻るへ
else if (m_MouseLook.leanAmount < 0)
{
lean = 4;
}
}
}
// 左から戻る
else if (lean == 2)
{
m_MouseLook.leanAmount -= 80f * Time.deltaTime;
if (m_MouseLook.leanAmount <= 0f)
{
m_MouseLook.leanAmount = 0f;
lean = 0;
}
// 右へ
if (!eU && eD)
{
lean = 3;
}
// 左へ
if (!qU && qD && !(!eU && eD))
{
lean = 1;
}
}
// 右へ移動
else if (lean == 3)
{
m_MouseLook.leanAmount -= 40f * Time.deltaTime;
/*
if (m_MouseLook.leanAmount <= 0f)
{
m_MouseLook.leanAmount -= 30f * Time.deltaTime;
}
else
{
m_MouseLook.leanAmount -= 80f * Time.deltaTime;
}*/
// 傾きを止める
if (m_MouseLook.leanAmount <= -20f)
{
m_MouseLook.leanAmount = -20f;
}
// 左へ
if (qD && !qU)
{
lean = 1;
}
// 右から戻るへ
if (eU && !(!qU && qD))
{
//lean = 4;
// 左へ
if (qG)
{
lean = 1;
}
// 右から戻るへ
else if (m_MouseLook.leanAmount <= 0)
{
lean = 4;
}
// 左から戻るへ
else if (m_MouseLook.leanAmount < 0)
{
lean = 2;
}
}
}
// 右から戻る
else if (lean == 4)
{
m_MouseLook.leanAmount += 80f * Time.deltaTime;
if (m_MouseLook.leanAmount >= 0f)
{
m_MouseLook.leanAmount = 0f;
lean = 0;
}
if (!qU && qD)
{
lean = 1;
}
if (!eU && eD && !(!qU && qD))
{
lean = 3;
}
}
text01.text = lean + "";
作ってみた後に、一方に傾けながら、もう一方を一瞬だけ入力してすぐ離したときに、最初の方向へ戻らないのが不自然だと思ったので、Input.GetKey()を追加しました。
傾けるときと戻るときでスピードを変えています。また、一方に傾けているときにもう一方へ切り返したときに、カメラが真っ直ぐに戻るまでと、戻った後さらに傾けるときでスピードを変えてみましたが、動きが少し変だったのでやめています。
lean とやると赤文字がでてコードが使えません
宣言すると使えます