Unityでは、シーンビュー上ではカメラの操作が可能です。しかし、ゲーム再生時のゲームビュー上では(何かしらの方法で実装しない限り)、カメラの操作はできません。
Unityを使ってツールをつくる際には、Unityエディタで当たり前のように使っている機能を、じぶんで実装する必要がでてきます。もちろんニーズに合ったアセットを探してきて利用してもよいのですが、今回はしゅみぷろさんのスクリプトを用いて説明させていただきます。
しゅみぷろさんのスクリプト
以下のURLに、Unityエディタのシーンビューのような視点移動ができるカメラのスクリプトが記載されています。
UnityでSceneビューのような視点移動ができるカメラを作る - しゅみぷろ (hatenablog.com)
こちらのスクリプトをコピペして、SceneViewCameraクラスを作成します。カメラにSceneViewCameraクラスのコンポーネントを追加してあげることで、Unityエディタのようなカメラ操作が可能になります。
Unityエディタのようなカメラ操作とは?
こちらのスクリプトに実装されているカメラ操作は以下の通りです。
- マウスホイール操作:カメラの前後移動
- マウスホイールドラッグ操作:カメラのパンニング
- 右クリックドラッグ操作:カメラの回転
こちらのスクリプトで実装されているのと同様にUnityエディタでカメラは、以下のように動作しています。
- マウスホイールを前後することで、カメラが前後します。
- マウスホイールをドラッグすることで、カメラの角度を固定したまま、水平方向や鉛直方向に移動します(パンニング)。
- 右クリックしてドラッグすることで、カメラが回転します。
詳しい解説
まず、スクリプトで重要な要素はマウスからの入力を拾うところです。
Input.GetAxis("Mouse ScrollWheel")は、マウスホイールの状態に応じて、-0.1, 0, 0.1のいずれかの値になります。
Input.mousePositionは画面の左下を(0, 0, 0)として、右上を(画面幅, 画面高, 0)としたマウスの位置情報になります。
Input.mousePositionの型はVector3という3次元情報になっていますが、実質的にXYの2次元情報です。
カメラの前後移動
Input.GetAxis("Mouse ScrollWheel")の値を元に、wheelSpeedをかけた分、カメラを前後に移動させます。
カメラのパンニング
マウスホイールがドラッグされたときに差分を計算して、moveSpeedと時間刻みをかけた分、カメラを差分ベクトルの逆方向に移動させます。そのため、たとえば右から左にマウスホイールをドラッグした場合、カメラは左から右に移動します。
カメラの回転
カメラの回転については、いささかトリッキーな動作をしています(Unityエディタに慣れると、無意識に自然に感じているものですが)。
右クリックしてドラッグされたときに差分を計算して、rotateSpeedをかけた分が回転します。
左右方向にマウスをドラッグした場合は、鉛直方向に回転します。上下方向にマウスをドラッグした場合はカメラ方向のX軸に対して回転します。
つまり、左右方向にドラッグする場合は回転する向きは鉛直方向に固定されているため、カメラの方向が水平に近いときはカメラを振るような動作をして、カメラの方向が鉛直に近いときは時計/反時計方向にカメラが回るような動作をします。
まとめ
この記事のポイントは、マウスによる2次元の入力が、3次元空間を移動するカメラを操作するためには、2次元から3次元への上手な橋渡しができるスクリプトの実装が必要だということです。
Unityでツールをつくるにあたって、カメラだけではなく、2次元入力から3次元モデルを操作していくことがとても重要になります。VRのように3次元空間の中で3次元モデルを操作する場合は気にしなくていいのですが、頭の片隅にでも、2Dから3Dの操作をしてるんだなぁと意識しておいてもらえるとよいです。