【Unity】カメラをマウスに連動させて回転させよう!|Camera入門③
前回の連載記事はCamera入門②「カメラの切り替えをスクリプトで実現しよう」でした。
連載の第三弾となる今回は、追従するカメラをマウスの動きに連動させて回転させる方法をご紹介します。
また、カメラをオブジェクトを中心に回転させる上で重要になるプログラムの記述についても詳しくご紹介します。
※本記事の被写体には「Unity-Chan(ユニティちゃん)」を使用しています。
© Unity Technologies Japan/UCL
参考ページ)ユニティちゃん公式サイト
Contents
マウスの動きに連動してカメラを回転させる(三人称視点)
まずはマウスの動きに連動してカメラを回転させる方法をご紹介します。
フィールドに被写体となるオブジェクトを準備してください。
↓ユニティちゃんを準備
カメラと被写体の位置関係は任意ですが、ここではメインカメラを被写体オブジェクトの子オブジェクトとしています。
ここまでの設定方法がわからない方はCamera入門②をご参考ください。
次にカメラをコントロールするためのスクリプトを作成します。
このスクリプトを作成するために、空のゲームオブジェクト「CameraController」を作成します。
次にスクリプトを作成します。
ヒエラルキービューで作成したCameraControllerを選択し、インスペクタービューの最下部AddComponentでスクリプトを作成します。
今回、ユニティちゃんのアセットを使用している都合上、名前を「CameraControll」とします。(ユニティちゃんアセット内に「CameraController」というスクリプトが存在するため、同名を避ける目的)
作成したスクリプトを以下のように編集してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class CameraControll : MonoBehaviour { private GameObject mainCamera; //メインカメラ格納用 private GameObject playerObject; //回転の中心となるプレイヤー格納用 public float rotateSpeed = 2.0f; //回転の速さ //呼び出し時に実行される関数 void Start() { //メインカメラとユニティちゃんをそれぞれ取得 mainCamera = Camera.main.gameObject; playerObject = GameObject.Find("unitychan"); } //単位時間ごとに実行される関数 void Update() { //rotateCameraの呼び出し rotateCamera(); } //カメラを回転させる関数 private void rotateCamera() { //Vector3でX,Y方向の回転の度合いを定義 Vector3 angle = new Vector3(Input.GetAxis("Mouse X") * rotateSpeed,Input.GetAxis("Mouse Y") * rotateSpeed, 0); //transform.RotateAround()をしようしてメインカメラを回転させる mainCamera.transform.RotateAround(playerObject.transform.position, Vector3.up, angle.x); mainCamera.transform.RotateAround(playerObject.transform.position, transform.right, angle.y); } } |
プログラムについては後ほど詳しく解説いたします。
では実際に動かして確認してみましょう。
ユニティちゃんを中心にカメラが回転していることがわかると思います。
また、ユニティちゃんを移動させても問題なく追従しています。
ここまで実装できれば、キー入力による回転なども問題なく実装できると思います。
ここからプログラムについて今回注目してほしい部分を解説します。
Vector3
まずはじめにVector3について解説します。
Vector3はUnityにおいてとても重要なベクトル表現の一つです。
コンストラクタは以下のように定義されています。
1 |
Vector3 変数名 = new Vector3(ベクトルのX成分,ベクトルのY成分,ベクトルのZ成分); |
Static変数も準備されています。Unityの記事でよく見かける表現もありますね。(公式マニュアルより)
back |
Vector3(0, 0, -1) と同じ意味
|
down |
Vector3(0, -1, 0) と同じ意味
|
forward |
Vector3(0, 0, 1) と同じ意味
|
left |
Vector3(-1, 0, 0) と同じ意味
|
negativeInfinity |
Shorthand for writing Vector3(float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity).
|
one |
Vector3(1, 1, 1) と同じ意味
|
positiveInfinity |
Shorthand for writing Vector3(float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity).
|
right |
Vector3(1, 0, 0) と同じ意味
|
up |
Vector3(0, 1, 0) と同じ意味
|
zero |
Vector3(0, 0, 0) と同じ意味
|
Input.GetAxis()
次にInput.GetAxis()について解説します。
GetAxis()はfloat型を返す関数です。引数に「Mouse X」「Mouse Y」と与えることでマウスのX・Y軸のそれぞれの動きに合わせた値を返します。
これによってマウスの動きに連動した値を取得することが可能になります。
transform.RotateAround()
最後にtransform.RotateAround()について解説します。
ある一点を中心にオブジェクトを回転させるための関数で以下のように定義されています。
1 |
public void RotateAround (Vector3 point, Vector3 axis, float angle); |
引数の意味は「ワールド座標の point
を中心とした軸( axis
)で angle
度回転」です。(公式マニュアルより)
今回のプログラムではpoint
にユニティちゃんの座標、axis
に回転軸となるX軸(transform.right)・Y軸(Vector3.up)、angle
に回転する角度を与えています。
おまけ:Quaternionを用いた回転(一人称視点)
おまけとしてQuaternionを用いた回転方法をご紹介します。
作成するスクリプトでは矢印キーで左右上下に回転することができるカメラを作成します。
以下のスクリプト「CameraController」をメインカメラにアタッチして動きを確認してみてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class CameraController : MonoBehaviour { //回転速度 public float rotationSpeed = 1f; //x軸回転角度の最大値 public float max_rotation_x = 60f; //現在の回転角度 private float rotation_x = 0f; private float rotation_y = 0f; // Update is called once per frame void Update() { if(Input.GetKey(KeyCode.LeftArrow)){ //回転角度を変更 rotation_y -= rotationSpeed; //y軸を軸に左回りにrotationSpeed度回転 transform.rotation = Quaternion.Euler(rotation_x, rotation_y, 0); } else if (Input.GetKey(KeyCode.RightArrow)) { //回転角度を変更 rotation_y += rotationSpeed; //y軸を軸に左回りにrotationSpeed度回転 transform.rotation = Quaternion.Euler(rotation_x, rotation_y, 0); } else if (Input.GetKey(KeyCode.UpArrow)) { //カメラの縦方向の角度の範囲を指定 if(rotation_x < -max_rotation_x){ //範囲外のときreturn return; } //回転角度を変更 rotation_x -= rotationSpeed; //x軸を軸に上方向に回転 transform.rotation = Quaternion.Euler(rotation_x, rotation_y, 0); } else if (Input.GetKey(KeyCode.DownArrow)) { //カメラの縦方向の角度の範囲を指定 if (rotation_x > max_rotation_x) { //範囲外のときreturn return; } //回転角度を変更 rotation_x += rotationSpeed; //x軸を軸に上方向に回転 transform.rotation = Quaternion.Euler(rotation_x, rotation_y, 0); } } } |
それでは実際に確認してみましょう。
一人称視点を実現することができました。
Quaternionに関する詳しい情報は以下をご参考ください。
まとめ
いかがでしたでしょうか。
Unityカメラの連載(Camera入門)第三弾として、カメラの回転方法についてご紹介してきました。
今回はマウスの動きに連動させた回転の実装でしたが、入力の受付方法を変えればキー入力など他の方法でも回転させることができると思います。
前回の連載記事よりもプログラムについての解説が増えてしまいましたが、マスターしてカメラを使いこなせるようになりましょう。
↓他の連載記事もぜひご参考ください。
Camera入門①)カメラの基本設定を理解しよう!
Camera入門②)カメラの切り替えをスクリプトで実現しよう!
Camera入門④)プレイヤーにカメラを追従させよう!(3D)
↓Unity関連記事はこちらをご参考ください
Unity関連記事)【入門】Unityを使ったアプリ開発ができるようになる!Unityの基本からARへの応用まで
この記事はいかがでしたか?
もし「参考になった」「面白かった」という場合は、応援シェアお願いします!