【Unity】プレイヤーを中心にしたカメラの回転と、カメラの向きに合わせて移動方向を変える方法

Unity-オブジェクトを中心にカメラを回転&カメラの向きに合わせて移動方向を調整 Unity
スポンサーリンク

3Dゲームにはよくプレイヤーキャラを中心に視点を回転して辺りを見回す操作がありますよね。
ほとんどの場合、視点を変えた後はカメラの向いている方向が正面になると思います。
今回は横方向に回転するカメラ操作と移動方向の制御を実装したので、そのやり方を紹介します。

この記事で使用しているUnityのバージョンは2021.3.1f1です。

指定したオブジェクトを中心にカメラを回転

カメラの回転処理のサンプルスクリプトです。
このスクリプトではInputSystemを使用していますが、カメラ回転操作の入力を取得している部分をInput.GetAxisでマウスやキー入力に変えれば従来のInputでも動きます。

using UnityEngine;
public class CameraController : MonoBehaviour
{
    private PlayerActions playerActions;
    private GameObject centerObject;    // カメラ回転の中心にするオブジェクト
    private float rotateSpeed;  // 回転速度
    void Start()
    {
        centerObject = GameObject.Find("Player");
        playerActions = new PlayerActions();
        playerActions.Enable();
        rotateSpeed = 0.5f;
    }
    void Update()
    {
        // カメラ追従
        FollowCamera();
        // カメラ回転
        RotateCamera();
    }
    /// <summary>
    /// カメラを追従させる
    /// </summary>
    private void FollowCamera()
    {
        // 中心オブジェクトの座標に合わせる
        transform.position = centerObject.transform.position;
    }
    /// <summary>
    /// カメラを回転させる
    /// </summary>
    private void RotateCamera()
    {
        // カメラ回転キーの入力を取得
        float move = playerActions.Camera.Rotation.ReadValue<float>();
        // 横方向の回転を計算
        float rotate = move * rotateSpeed;
        // 回転させる
        transform.eulerAngles += new Vector3(0, rotate, 0);
    }
}

スクリプトができたらそれをアタッチするためのオブジェクトを作成します。
空のオブジェクトを作成し、カメラを子オブジェクトにします。
カメラを直接動かすような処理をあまりやりたくなかったのでこの方法にしました。
子オブジェクトにしたカメラの位置や角度をいい感じに調整しておきます。

CameraControllという空オブジェクトを作成し、子オブジェクトにカメラを設定した画像
CameraControllという空オブジェクトを作成し、カメラを子オブジェクトにしています

空オブジェクトの方に先ほどのスクリプトをアタッチしています。
こちらはプレイヤーキャラ(視点の中心にするオブジェクト)の位置に追従するようにしているので座標はあまり気にしなくていいです。

CameraControllにスクリプトをアタッチしているInspectorウィンドウの画像
このオブジェクトの位置が動くと子オブジェクトのカメラも一緒に動きます

実行してみるとプレイヤーを中心にカメラをぐるぐる回せると思います。

カメラ回転操作の実行gif
移動するとカメラも追従します

カメラの向いている方向を正面にして移動

今の状態だと、移動処理の実装の仕方によってはカメラを回転させた後に思い通りの方向へ移動してくれない場合があります。
視点操作時に回転しているのは空のオブジェクトなので、プレイヤーキャラ自身の向きは変わっていません。
プレイヤーキャラから見た方向とカメラから見た方向が揃っていないので、「上方向に入力しているのに右に移動する」といった現象が起きてしまいます。
これを解消するために、カメラの向きに合わせて移動方向を変更してあげる必要があります。
以下は移動処理のサンプルスクリプトです。

using UnityEngine;
public class PlayerMove : MonoBehaviour
{
    PlayerActions playerActions;
    private Rigidbody rb;
    public GameObject viewDirection;
    void Start()
    {
        rb = GetComponent<Rigidbody>();
        playerActions = new PlayerActions();
        playerActions.Enable();
    }
    private void FixedUpdate()
    {
        // 移動操作入力を取得
        Vector2 move = playerActions.Player.Move.ReadValue<Vector2>();
        // 視点の方向を取得
        Vector3 forward = viewDirection.transform.TransformDirection(Vector3.forward);
        Vector3 right = viewDirection.transform.TransformDirection(Vector3.right);
        // 移動方向を計算
        Vector3 moveVector = move.x * right + move.y * forward;
        if (moveVector.magnitude > 1)
        {
            // 大きさが1より大きかったら正規化
            moveVector.Normalize();
        }
        // 最大速度を計算
        float speed = (5 * moveVector.magnitude - rb.velocity.magnitude) / Time.fixedDeltaTime;
        // 移動
        rb.AddForce(moveVector * speed);
        if (move != Vector2.zero)
        {
            // 移動方向を向くようにプレイヤーを回転させる
            transform.localRotation = Quaternion.Lerp(transform.localRotation, Quaternion.LookRotation(moveVector), 20.0f * Time.fixedDeltaTime);
        }
    }
}

カメラの向きに合わせて移動方向を変えている処理は以下の部分です。
TransformDirectionでオブジェクトの方向を取得します。

// 視点の方向を取得
        Vector3 forward = viewDirection.transform.TransformDirection(Vector3.forward);
        Vector3 right = viewDirection.transform.TransformDirection(Vector3.right);
        // 移動方向を計算
        Vector3 moveVector = move.x * right + move.y * forward;

このスクリプトをプレイヤーキャラ(視点の中心のオブジェクト)にアタッチします。
viewDirectionにはカメラの回転で使用した空のオブジェクト(CameraControllerをアタッチしたオブジェクト)を設定します。
実行してみると、カメラが回転しても入力方向の通りにプレイヤーキャラが移動するようになるはずです。

参考にした記事

処理の実装は以下の記事を参考にさせていただきました。

【Unity】3Dのカメラ視点移動とロックオン機能について | ゴマちゃんフロンティア
040 カメラの向きに合わせてGameObjectを移動させる [stepism@Unityメモ]

コメント

  1. えじ より:

    Unityに興味があるので、記事をみさせていただきました!

    • バニラ バニラ より:

      コメントありがとうございます!
      Unityに挑戦する際の参考になれば幸いです(*^-^*)

タイトルとURLをコピーしました