公開日:2023/05/25  更新日:2023/05/25

UnityのC#でのカメラ操作

 Unityのカメラはゲームをしているプレイヤーが見る画面を映し出す
 カメラ操作を覚えれば、カメラを動くキャラに追従させるといったことも可能となる。
 この記事を読む前に、C#でのスクリプトの開き方、基本的な構文の作り方、変数、演算子がわからない場合は先に以下の記事で確認してほしい。
UnityのC#の書き方
UnityのC#の変数・演算子
if文の条件分岐
Inputの使用方法

 また、Unityの基礎知識や操作などがわからない場合は先に以下の記事を確認してほしい。
Unityの基礎まとめ

 この記事ではC#でカメラ操作を行い、ゲームオブジェクトにカメラを追従させたり、マウスカーソルの動きにあわせてカメラの向きを変える方法を紹介していく。

UnityのC#のカメラ操作目次

ゲームオブジェクトにカメラを追従させる
マウスを動かしてカメラの向きを変化させる
目次にもどる

ゲームオブジェクトにカメラを追従させる

 まずはゲームオブジェクトの後ろからカメラが追従してついてくるようにすることを目指す。
 まず、ゲームオブジェクトのcubeを作成しよう。
 最初からあるMain Cameraをcubeの子にしよう。親子関係についてよくわからない場合は以下の記事を確認。

親子関係
 そしてMain Cameraが後方からcubeを映せる位置に調整する。

 後はゲームオブジェクトをWASDキーで移動できるようにする。以下のようなスクリプトを作成しよう。
 スクリプトの意味がわからない場合は以下の記事を確認してみてほしい。
Inputの使用方法
 スクリプトを作成してcubeにアタッチすれば、cubeを移動させることでMain Cameraもそれに追従するようにできる。以下のように下にゲームオブジェクトのplaneを敷くとゲームオブジェクトの動きがわかりやすい。

目次にもどる

マウスを動かしてカメラの向きを変化させる

 ゲームオブジェクトのcubeにカメラが追従してくるようになったので、次はマウスカーソルを動かすことで、カメラの向きが変えられるようにしていく。以下のようなスクリプトをMain CameraにアタッチすればOKだ。
 最初に[SerializeField] GameObject cube;とある。下の行でtransform.RotateAroundを使ってゲームオブジェクトを指定する必要があるため、インスペクター欄でゲームオブジェクトの指定ができたほうが毎回スクリプトを開く必要がなく都合がいいのでシリアル化(シリアライズ)している。
 次に[SerializeField] float kaitensokudo = 2;とあるが、ここでカメラの移動速度の調整を可能にしている。これもpublicをつけてシリアル化している。

 Updateメソッドにはfloat mx = Input.GetAxis("Mouse X")とfloat my = Input.GetAxis("Mouse Y");とある。
 これでマウスの移動量を受け取っている。Mouse Xは左右の移動量。Mouse Yは上下の移動量である。Input.GetAxisの詳細は以下の記事。
Input.GetAxisの使用方法

 次にif (Mathf.Abs(mx) > 0.001f)のように条件分岐を行っている。
 Mathf.AbsはMathf関数(数学に関する処理を行う)の一つ。Absには絶対値という意味がある。数直線上の原点0からの距離を表す。3の絶対値は3。-3の絶対値も3である。-の概念があっても正しく距離を計算できるためUnityでのゲーム制作でもよく用いられるので覚えておこう。
 Input.GetAxis("Mouse X")は画面中央を原点としてマウスが右側に移動すればプラス、左側に移動すればマイナスとなっているがMathf.Absなら移動距離を出すことができる。0.001fを超える・・つまりごくわずかにでもマウスを動かしていたら中身の処理が行われる。

 if (Mathf.Abs(mx) > 0.001f)の中身はtransform.RotateAround(cube.transform.position, Vector3.up, mx * kaitensokudo);である。
 これはマウスの左右移動にあわせてMain Cameraを動かす処理となっている。
 transform.RotateAroundは指定されたゲームオブジェクトを中心に軸を決めて回転角度の分だけ回転させることができる。
 RotateAround(中心の場所,軸の方向,回転角度)のように記述をしている。
 中心の場所はcube.transform.positionであり親であるcubeの位置が中心となっている。
 軸の方向はVector3.upでありYを軸にしている。つまり、以下のようにcubeの上下に伸びる線を中心としてMain Cameraが回転することを示す(Vector3はワールド軸である)。

 回転角度はマウスの左右移動量が入ったmxに最初に設定したkaitensokudoをかけている。マウスが左右移動した分だけMain Cameraが回転し、その回転移動量をkaitensokudoで調整可能となっている。

 続いて前に説明したのと同様にif (Mathf.Abs(my) > 0.001f)のように条件分岐を行っている。
 その中身はtransform.RotateAround(cube.transform.position, transform.right, -my * kaitensokudo);である。
 これはマウスの上下移動にあわせてMain Cameraを動かす処理となっている。
 中心の場所は前に説明したのと同様にcube。
 軸の方向はtransform.rightでありMain CameraのX軸を指定している(transformはローカル軸である)。中心となる場所としてcubeを選んでいるのに、Main cameraのX軸を中心に回転するというのはわかりにくいかもしれない。
 左右移動の際は軸はVector3.upとなっておりワールドのY軸を中心に回転している。上下移動はワールドのX軸を中心に回転させればいいと思う人もいるかもしれない。
 例えば、Main Cameraがcubeの後ろにある以下のような状態を想像してほしい。

 この状態でマウスを右に移動させていこう。やがてcubeのY軸が中心なので以下のようになる。

 この状態からマウスを上移動させる時、ワールドのX軸が中心では上下に移動しない(回転したMain camera自身がX軸上に位置するためである)。
 軸の方向としてMain cameraのX軸を選んでおくことで、Main cameraをどれだけマウスの左右移動で移動させて向きが変わったとしても、マウスの上下移動で上下に視点変更が可能となる。

 最後の-my * kaitensokudoだが、なぜ-がついているのかわからないという人もいるかもしれない。
 cubeをキャラとして考えると、マウスを右に動かせばキャラの右前、左に動かせばキャラの左前、上に動かせばキャラ前上、下に動かせばキャラの前下が見られるようにしたかった。
 -がないとマウスを上に動かすとキャラの前下が見られるようになってしまう。
 軸に対してゲームオブジェクトが回転する方向は軸の矢印の尖ってないないほうから尖っているほう(始点から終点)を見た場合に反時計周りとなっているからだ。

 よって、マウスを上に動かし+の値が入力されてしまうと、Main cameraは反時計周りに回転してしまい、キャラの前下を映し出す。
 なので、-をつけてMain cameraが時計周りになるようにしている。非常にこんがらがりそうになるが、何度も想像して理解してほしい。
UnityのC#の基礎まとめへ戻る

page top