【Unity】FPSキャラのカメラを横に傾ける #1

投稿者: | 2020-05-30

曲がり角から覗き見るように、一人称視点のプレイヤーのカメラを横に傾けます。今回はカメラの回転だけをやってみました。

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()を追加しました。

傾けるときと戻るときでスピードを変えています。また、一方に傾けているときにもう一方へ切り返したときに、カメラが真っ直ぐに戻るまでと、戻った後さらに傾けるときでスピードを変えてみましたが、動きが少し変だったのでやめています。

無料ホラーゲームを作りました

【Unity】FPSキャラのカメラを横に傾ける #1」への2件のフィードバック

  1. 匿名

    lean とやると赤文字がでてコードが使えません

    返信
    1. nekoromorph 投稿作成者

      宣言すると使えます

      // FirstPersonController 
      public class FirstPersonController : MonoBehaviour
      {
      
          // ...
      
          int lean;
          [SerializeField] Text text01;
      
          private void Start()
          {
              // ....
          }
      
          private void Update()
          {
              // リーン
              bool eD = Input.GetKeyDown(KeyCode.E);
              bool eU = Input.GetKeyUp(KeyCode.E);
              
              // ...
          }
          // ...
      }
      
      // ---
      // MouseLook
      
      public class MouseLook
      {
          public float leanAmount;
          
          // ...
      
          public void LookRotation()
          {
              // ...
      
              // リーン
              Vector3 e = camera.localRotation.eulerAngles;
              e.z = leanAmount;
              camera.localRotation = Quaternion.Euler(e);
      
      
              UpdateCursorLock();
          }
      
          // ...
      }
      
      返信

コメントを残す

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