Unityでゲームを作る時、プレイヤーの操作感を高めるために「カメラのズームイン・ズームアウト」する機能はとても重要です。
特に3Dや戦略ゲームでは、視点の拡大・縮小が快適なプレイ体験につながります。
この記事では、マウスホイール操作でカメラをズームイン・ズームアウトさせる基本的な方法を、初心者にもわかりやすく解説します。Cinemachineを使わない、Unity標準のカメラを対象としたシンプルな実装から始めましょう。
ズーム操作でカメラの自由度を高めよう

前回は「カメラをキャラクターに追従させる」「自由視点カメラを作る」ことで、ゲーム内での視点操作ができるようになりました。
今回はそのカメラに ズームイン・ズームアウト の機能を追加し、より柔軟な操作を実現します。
特に、探索ゲームやストラテジー系ではズーム操作が重要になります。
この記事では、マウスホイール操作でズーム制御できるカメラの基本的な実装方法を学びます。
ズーム方法は2通りある?

カメラのズームって、実はやり方が2通りあるのをご存じでしたか?
ざっくり分けると、次のような方法があります。
- Camera.fieldOfView を変える方法(視野角の変化でズームっぽく見せる)
- Transform.position を変える方法(カメラの位置そのものを動かして距離を調整)
どちらにもメリットがありますが、今回のような自由視点カメラと組み合わせるなら、Transform.position を動かしてズームする方法が相性バツグンです。
これからは、この「カメラ自体が近づいたり遠ざかったりする方法」でズーム機能をつけていきましょう!
自由視点カメラにズーム機能を追加しよう

ここからは、前回作成した自由視点カメラのスクリプトに、ズームイン・ズームアウトの処理を追加していきます。

今回も同じプロジェクトを使ってOKです。
マウスで視点をぐりぐり動かせる状態のカメラに、「ホイール操作で前後移動するズーム機能」を加えていきましょう!
まずは、ズームに必要な変数をスクリプトの冒頭に追加します。これらのパラメータは インスペクター(Inspector) からも調整可能です。
public float zoomSpeed = 10f;
public float minZoomDistance = 2f;
public float maxZoomDistance = 15f;

続いて、LastUpdate()
メソッド内にマウスホイールの入力を取得するコードを追加します。
float scrollInput = Input.GetAxis("Mouse ScrollWheel");
この値はスクロール時に正(上方向)や負(下方向)の小さな数値が返ってきます。これを使ってカメラの前後移動をコントロールします。
ズーム方向にカメラを動かす処理を追加

それでは、取得した scrollInput
を使って、カメラをズームイン・ズームアウトできるようにしてみましょう。
ズームには、マウスホイールの回転量を取得する Input.GetAxis("Mouse ScrollWheel")
を使います。
以下のコードを LastUpdate()
内の
後に追加してください。Input.GetAxis("Mouse ScrollWheel")
// ズーム処理(マウスホイール)
float scrollInput = Input.GetAxis("Mouse ScrollWheel");
if (scrollInput != 0)
{
distance -= scrollInput * zoomSpeed;
distance = Mathf.Clamp(distance, minZoomDistance, maxZoomDistance);
}
zoomSpeed
はズームの感度、minZoomDistance
と maxZoomDistance
は ズームできる範囲を制限するための変数です。
ズーム処理の後は、回転と同様にカメラの位置を再計算します。
その際、更新された distance
が自然に反映されるため、カメラのズームが視覚的に有効になります。
if (Input.GetMouseButton(1)) // 右クリック中
{
x += Input.GetAxis("Mouse X") * xSpeed * Time.deltaTime;
y -= Input.GetAxis("Mouse Y") * ySpeed * Time.deltaTime;
y = Mathf.Clamp(y, yMinLimit, yMaxLimit);
}
Vector3 offsetTarget = target.position + new Vector3(0, 1.5f, 0);
Quaternion rotation = Quaternion.Euler(y, x, 0);
Vector3 position = rotation * new Vector3(0.0f, 0.0f, -distance) + offsetTarget;
transform.rotation = rotation;
transform.position = position;
ズーム処理とカメラの位置・回転処理を LateUpdate() の中にまとめることで、
処理の競合やズームの打ち消しを防ぎ、より安定した挙動を実現しています。
プレイモードでズームの動作を確認しよう

ズーム機能を実装したら、さっそく Unity のプレイモードで動作確認してみましょう!
右クリックを押しながらマウスを動かすと視点が回転し、
マウスホイールを回すとカメラがズームイン・ズームアウトするようになっていれば成功です。
ズーム操作に違和感がある場合は、以下のパラメータを調整してみましょう。
zoomSpeed
:ズームの速さ(大きくすると速くズーム)minZoomDistance
:最も近づける距離maxZoomDistance
:最も遠ざけられる距離
ズームが早すぎると一気に近づきすぎたり、
逆に遅すぎると動いているのか分からなかったりします。
自分のゲームに合った感度に調整して、プレイヤーにとって快適なカメラ操作を目指しましょう!
ズーム感を分かりやすくするコツ
ズームの効果が分かりづらい場合は、カメラの正面にプレイヤーキャラやオブジェクトを配置してみましょう。
ズームに合わせて対象が大きく見えたり、小さくなったりすることで効果を直感的に確認できます。
ズーム機能を加えるとカメラの完成度がアップ!

今回は、前回作成した自由視点カメラに、ズームイン・ズームアウト機能を追加しました。
マウスホイールで直感的にカメラの距離を調整できるようになったことで、
視認性や操作性がグッと向上したのではないでしょうか。
ズーム処理は distance
という変数を使って行い、
カメラの回転・位置と一緒に LateUpdate()
で制御することで、自然で滑らかな動きを実現できました。
自由視点カメラとズームが組み合わさることで、より多くのゲームジャンルに対応できる汎用的なカメラが完成します。
次のチャレンジへ!
次回はこのカメラをベースに、キャラクターを追従しながら回転・ズームもできるカメラを目指していきます。
ちょっとしたミニゲームを作るような感覚で、応用的なカメラ制御にチャレンジしていきましょう!
お疲れさまでした 😊