こんにちは、ともくんのゲーム作り部屋にようこそ!
このページでは、
「マウスでカメラを回転させる方法を知りたい!」
「プレイヤーを中心にカメラを回転させたい!」
というお悩みの方に向けた内容となっています。
3Dゲームの多くでは、マウスを使ってカメラを回転させることで、ゲーム内の視点を変えることができます。
Unityでは、マウスでカメラを回転させる場合、マウスでの移動量を取得してその値を元にカメラオブジェクトを回転させるという処理を行うことで、視点移動の処理を作ることができます。
また、カメラの位置で回転させる以外にも、プレイヤーなどの特定のオブジェクトを中心としてカメラを移動・回転させることもできます。
そこで、このページでは、Unityでゲームを作る際に、マウスでカメラを回転させる方法についてまとめていきます。
マウスを使ってカメラを回転させる
ここでは、以下の青色のオブジェクトをプレイヤーと見立て、カメラを回転させる処理を作っていきます。

また、マウスを使ってカメラを回転させる処理として、
をそれぞれ説明していきます。
カメラを中心に回転する処理
カメラを中心に回転させる場合は、カメラオブジェクトに対して、Rotateメソッドで回転する処理を加えていくことになります。

ここでは、マウスをクリックした状態で、マウスカーソルを動かすとカメラが回転する処理を作っていきます。
using UnityEngine;
public class CameraController : MonoBehaviour
{
float rotationSpeed = 2.0f; // カメラを回転させる速度
float mouse_X; // X軸におけるマウスの移動
float mouse_Y; // Y軸におけるマウスの移動
void Update()
{
// マウスをクリックした場合
if (Input.GetMouseButton(0))
{
mouse_X = Input.GetAxis("Mouse X") * rotationSpeed; // マウスのX軸の移動量を取得
mouse_Y = Input.GetAxis("Mouse Y") * rotationSpeed; // マウスのY軸の移動量を取得
transform.Rotate(mouse_Y, mouse_X, 0); // カメラを回転させる処理
}
}
}
まず、14行目と15行目で「Input.GetAxis」を使って、マウスの移動量を取得しています。
このGetAxisメソッドは、キーボードやマウスなどの様々な入力情報から、必要となる値を取得することができるメソッドで、引数に「Mouse X」「Mouse Y」と記述することで、X軸とY軸におけるそれぞれのマウスの移動量(デルタ)を取得することができます。
そして、この値に対してカメラの回転速度となるrotationSpeedをかけた計算を行っています。
実際に、カメラを回転させる処理は、16行目でRotateメソッドを使って行っています。
Rotateは、引数に指定した角度で回転処理を行うメソッドで、この引数に先ほど取得したマウスの移動量をVector3型で指定してあげます。
ただし、
- マウスのX軸での移動量 ⇒ Y軸を中心とした回転
- マウスのY軸での移動量 ⇒ X軸を中心とした回転
となるため、Rotateの引数に指定する際は、マウスのX軸とY軸の値を反対にして入れてあげる必要があります。
これで、実際にゲームを実行してみます。

マウスをクリックした状態でマウスを動かすと、カメラがいる位置を中心にして視点を回転させることができています。
プレイヤーを中心に回転する処理
先ほどは、カメラを中心に回転させましたが、今度はプレイヤーとなるオブジェクトを中心としてカメラを移動・回転させてみます。

カメラにアタッチしているスクリプトを以下のように修正していきます。
using UnityEngine;
public class CameraController : MonoBehaviour
{
float rotationSpeed = 2.0f;
float mouse_X;
float mouse_Y;
public GameObject player; // プレイヤーオブジェクトの変数
void Update()
{
// マウスをクリックした場合
if (Input.GetMouseButton(0))
{
mouse_X = Input.GetAxis("Mouse X") * rotationSpeed;
mouse_Y = Input.GetAxis("Mouse Y") * rotationSpeed;
transform.RotateAround(player.transform.position, Vector3.up, mouse_X); // Y軸に対して回転させる処理
transform.RotateAround(player.transform.position, transform.right, mouse_Y); // X軸に対して回転させる処理
}
}
}
8行目で、プレイヤーとなるオブジェクトを取得する変数playerを宣言しています。
この変数はpublic修飾子を付けて宣言しておくことで、カメラオブジェクトを選択した状態で、インスペクターウィンドウから変数にアクセスして、プレイヤーの実体を設定しておきます。

特定の場所を中心に回転させる場合は、17行目と18行目に記述しているRotateAroundメソッドを使います。
このRotateAroundメソッドを使う際は、引数で以下のように指定します。
RotateAround(Vector3 point, Vector3 axis, float angle);
point:回転の中心となる座標
axis:回転する軸
angle:回転する角度
回転の中心となる場所は、「player.transform.position」でプレイヤーの座標を取得して指定しています。
回転する軸は、
- マウスのXの移動はワールド座標におけるY軸の回転 ⇒ Vector3.up
- マウスのYの移動はプレイヤーにおけるX軸の回転 ⇒ transform.right
としてそれぞれ指定しています。
これでゲームを実行してみると、

マウスを動かすとプレイヤーを中心にしてカメラが回転しており、カメラオブジェクト自体は回転だけでなく移動も行われているのが分かります。
プレイヤーの向きも一緒に回転する処理
プレイヤーを中心にしてカメラを回転させることができましたが、次はカメラを回転させたら一緒にプレイヤーの向きが変わるように処理を追加していきます。

カメラのスクリプトに、プレイヤーの向きが変わるように以下の修正を加えていきます。
using UnityEngine;
public class CameraController : MonoBehaviour
{
float rotationSpeed = 2.0f;
float mouse_X;
float mouse_Y;
public GameObject player;
void Update()
{
// マウスをクリックした場合
if (Input.GetMouseButton(0))
{
mouse_X = Input.GetAxis("Mouse X") * rotationSpeed;
mouse_Y = Input.GetAxis("Mouse Y") * rotationSpeed;
transform.RotateAround(player.transform.position, Vector3.up, mouse_X);
transform.RotateAround(player.transform.position, transform.right, mouse_Y);
player.transform.rotation = Quaternion.Euler(0, transform.eulerAngles.y, 0); // プレイヤーの向きを変更させる処理
}
}
}
20行目でプレイヤーの回転を決めるrotationに、Quaternionで定義されているEulerメソッドを使って、カメラのY軸の角度を指定して、回転する処理を行っています。
このEulerは、引数でそれぞれの軸で指定した角度(オイラー角)でQuaternionを作成できるメソッドで、プレイヤーはY軸だけで回転処理を行いたいので、「transform.eulerAngles.y」でカメラの角度を指定しています。
これでゲームを実行してみると、

カメラを回転させると、プレイヤーとなるオブジェクトもカメラと一緒に向きが変わっているのが分かります。
また、カメラと同時ではなく、少し遅れて滑らかにプレイヤーの向きを変えたいという場合は、以下のようにスクリプトを書くことで実現できます。
using UnityEngine;
public class CameraController : MonoBehaviour
{
float rotationSpeed = 2.0f;
float mouse_X;
float mouse_Y;
public GameObject player;
Quaternion target; // 目標となる回転
void Update()
{
// マウスをクリックした場合
if (Input.GetMouseButton(0))
{
mouse_X = Input.GetAxis("Mouse X") * rotationSpeed;
mouse_Y = Input.GetAxis("Mouse Y") * rotationSpeed;
transform.RotateAround(player.transform.position, Vector3.up, mouse_X);
transform.RotateAround(player.transform.position, transform.right, mouse_Y);
target = Quaternion.Euler(0, transform.eulerAngles.y, 0); // カメラのY軸の角度だけを使ったQuaternionを作成
player.transform.rotation = Quaternion.Slerp(player.transform.rotation, target, Time.deltaTime * 2); // プレイヤーの向きを滑らかに移動させる処理
}
}
}
22行目で、Quaternionで定義されているSlerpメソッドを使って、プレイヤーの向きを変えています。
このSlerpメソッドは、引数で現在の向きから指定した向きへ、少しずつ時間をかけて近づけるという処理を行ってくれるメソッドです。
Quaternion.Slerp(Quaternion from, Quaternion to, float timeCount);
from:現在のオブジェクトの回転・向き
to:目的となる回転・向き
timeCount:処理の割合(時間)
現在のオブジェクトの回転を「player.transform.rotation」で取得し、目的とする回転を21行目でカメラのY軸の角度を指定してQuaternionで取得しています。
これでもう一度ゲームを実行してみると、

カメラを回転させると、少し遅れてプレイヤーとなるオブジェクトの向きが変わっているのが分かります。
まとめ
このページでは、Unityでマウスを使ってカメラを回転させる方法についてまとめていきましたが、いかがでしたでしょうか?
マウスを使ってカメラを回転させる場合は、GetAxisメソッドでマウスの移動量を取得して、Rotateメソッドで回転処理を行います。
特定のオブジェクトを中心として回転させる場合は、RotateAroundメソッドでプレイヤーなどの座標を軸にカメラを回転させることができます。
また、このページでは紹介していませんが、さらにカメラを追従させることで、よりFPSなどのような自由な視点移動とキャラクター移動を一緒に行えるようになるので、良かったら以下のページも参考にしてみてください。
最後までお読みいただきまして、ありがとうございました!
コメント