ゲーム開発でカメラ制御を実装しようとすると、様々な数学的な概念が必要になります。
「カメラをプレイヤーに追従させるには?」
「カメラの回転を計算するには?」
「座標変換ってどうやるの?」
そんな疑問を抱えている方に向けて、ゲーム開発で必須のカメラ制御の数学について、初心者でも理解できるように解説します。
\読むだけで終わらせない!実際にゲームを作って実力をつけよう/
トレンド×入門に最適
Unity ノンフィールドRPG
+スレスパ風JRPG講座
Unity6対応・スマホ化対応の最新カリキュラム。今もっとも人気のデッキ構築型ゲームをJRPGと組み合わせて実装。初心者が最初に選ぶ一本として最適です。
王道アクションに挑戦
Unity 2Dアクションゲーム
の作り方講座(ロックマン風)
ロックマン風の本格横スクロールACTをスマホ化・広告実装まで対応。7ステージ+ラスボスという市販ゲームに近い本格構成で、リリースまで見据えて作れます。
3D入門に最適
ゼルダ風3Dアクションゲーム
の作り方講座
ゼルダの伝説・モンハン・原神のような3Dアクションをスマホ対応で作れる入門講座。初心者でも全16回でしっかり3D開発の基礎を習得できます。
あなたのオリジナルゲーム、今年こそ完成させませんか?
RPG・アクション・ホラー…Unityで本格ゲームを作りたい人のための学習サイトです。
実際に完成するゲームを題材に、
ソースコード・素材・プロジェクト一式をすべて公開。
仕事や学校の合間の1〜2時間でも、
「写経→改造」で自分のゲームまで作りきれる環境です。
カメラ制御の基本
カメラ制御とは、3D空間内でカメラの位置と向きを制御する技術です。
ゲームでは、プレイヤーの視点を制御するために様々なカメラ制御が使われます。
FPSゲームでは第一人称視点、TPSゲームでは第三人称視点、アクションゲームでは追従カメラなど、ゲームの種類によって最適なカメラ制御が異なります。
カメラ制御の種類
ゲームで使われる主なカメラ制御には、以下のようなものがあります。
- 固定カメラ:位置と向きが固定されたカメラ
- 追従カメラ:プレイヤーやオブジェクトを追いかけるカメラ
- 回転カメラ:対象の周りを回転するカメラ
- FPSカメラ:プレイヤーの視点そのもののカメラ
- TPSカメラ:プレイヤーの後ろから見るカメラ
カメラ制御に必要な数学
カメラ制御を実装するには、以下の数学的な知識が必要になります。
- 座標変換:ワールド座標とビュー座標の変換
- ベクトル計算:方向ベクトルと距離の計算
- 回転:オイラー角とクォータニオン
- 補間:滑らかなカメラ移動の実現
- 3D空間内でカメラの位置と向きを制御する技術
- ゲームの種類によって最適な制御方法が異なる
- 座標変換やベクトル計算などの数学知識が必要
- 滑らかな動きを実現するため、補間が重要
座標変換の基礎
カメラ制御を理解するには、座標変換の知識が不可欠です。
ワールド座標系とビュー座標系
ゲームでは、2つの座標系が使われます。
ワールド座標系は、ゲーム空間全体での座標。
ビュー座標系は、カメラを基準とした座標系です。
カメラが映す画面は、ビュー座標系で表現されます。
座標変換行列
ワールド座標からビュー座標への変換は、ビュー変換行列を使って行います。
Unityでは、カメラのworldToCameraMatrixがこの変換行列です。
|
1 2 3 4 |
// ワールド座標からビュー座標への変換 Vector3 worldPosition = new Vector3(10, 5, 0); Vector3 viewPosition = Camera.main.worldToCameraMatrix.MultiplyPoint(worldPosition); |
ビュー座標系では、カメラの前方が-Z方向、右が+X方向、上が+Y方向になります。
スクリーン座標への変換
ビュー座標からスクリーン座標(画面のピクセル位置)への変換は、プロジェクション変換で行われます。
Unityでは、Camera.WorldToScreenPointメソッドが便利です。
|
1 2 3 4 |
// ワールド座標からスクリーン座標への変換 Vector3 worldPosition = new Vector3(10, 5, 0); Vector3 screenPosition = Camera.main.WorldToScreenPoint(worldPosition); |
追従カメラの数学
プレイヤーを追いかけるカメラを実装する方法を見ていきましょう。
基本的な追従
最もシンプルな追従カメラは、カメラの位置をプレイヤーの位置に直接設定する方法です。
|
1 2 3 4 5 6 7 |
public Transform target; // 追従対象 void Update() { transform.position = target.position; } |
ただし、この方法だとカメラがプレイヤーと完全に重なってしまいます。
オフセットを使った追従
カメラとプレイヤーの間にオフセット(相対位置)を設定することで、適切な距離を保てます。
|
1 2 3 4 5 6 7 8 9 |
public Transform target; public Vector3 offset = new Vector3(0, 5, -10); // カメラの相対位置 void Update() { transform.position = target.position + offset; transform.LookAt(target); // 対象を見る } |
Transform.LookAtを使えば、カメラが対象の方向を向きます。
滑らかな追従(補間)
カメラの動きを滑らかにするには、補間を使います。
|
1 2 3 4 5 6 7 8 9 10 11 |
public Transform target; public Vector3 offset = new Vector3(0, 5, -10); public float smoothSpeed = 5.0f; // 補間速度 void LateUpdate() { Vector3 desiredPosition = target.position + offset; transform.position = Vector3.Lerp(transform.position, desiredPosition, smoothSpeed * Time.deltaTime); transform.LookAt(target); } |
Vector3.Lerpを使うことで、カメラが滑らかに移動します。
LateUpdateを使うことで、プレイヤーの移動後にカメラを更新できます。
回転カメラの数学
対象の周りを回転するカメラを実装する方法を見ていきましょう。
角度を使った回転
角度を使って、カメラを対象の周りに配置します。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
public Transform target; public float distance = 10.0f; // カメラと対象の距離 public float rotationSpeed = 50.0f; private float currentAngle = 0f; void Update() { // 角度を更新 currentAngle += rotationSpeed * Time.deltaTime; // 角度から位置を計算 float radian = currentAngle * Mathf.Deg2Rad; float x = target.position.x + distance * Mathf.Cos(radian); float z = target.position.z + distance * Mathf.Sin(radian); transform.position = new Vector3(x, target.position.y + 5, z); transform.LookAt(target); } |
三角関数を使って、円周上の位置を計算しています。
マウス入力を使った回転
マウス入力でカメラを回転させることもできます。
|
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 |
public Transform target; public float distance = 10.0f; public float mouseSensitivity = 2.0f; private float horizontalAngle = 0f; private float verticalAngle = 30f; void Update() { // マウス入力を取得 float mouseX = Input.GetAxis("Mouse X") * mouseSensitivity; float mouseY = Input.GetAxis("Mouse Y") * mouseSensitivity; // 角度を更新 horizontalAngle += mouseX; verticalAngle -= mouseY; verticalAngle = Mathf.Clamp(verticalAngle, -80f, 80f); // 上下の制限 // 角度から位置を計算 float hRadian = horizontalAngle * Mathf.Deg2Rad; float vRadian = verticalAngle * Mathf.Deg2Rad; float x = target.position.x + distance * Mathf.Cos(vRadian) * Mathf.Sin(hRadian); float y = target.position.y + distance * Mathf.Sin(vRadian); float z = target.position.z + distance * Mathf.Cos(vRadian) * Mathf.Cos(hRadian); transform.position = new Vector3(x, y, z); transform.LookAt(target); } |
水平角と垂直角の両方を制御することで、3D空間内で自由に回転できます。
カメラの向きの計算
カメラを特定の方向に向ける方法を見ていきましょう。
LookAtを使った向き設定
最も簡単な方法は、Transform.LookAtを使うことです。
|
1 2 3 4 5 6 7 |
public Transform target; void Update() { transform.LookAt(target); } |
カメラが自動的に対象の方向を向きます。
方向ベクトルから向きを計算
方向ベクトルから、クォータニオンを計算することもできます。
|
1 2 3 |
Vector3 direction = (target.position - transform.position).normalized; transform.rotation = Quaternion.LookRotation(direction); |
Quaternion.LookRotationを使えば、方向ベクトルからクォータニオンを生成できます。
上方ベクトルの指定
カメラの上方向を指定することもできます。
|
1 2 3 4 |
Vector3 direction = (target.position - transform.position).normalized; Vector3 up = Vector3.up; // 上方向 transform.rotation = Quaternion.LookRotation(direction, up); |
これにより、カメラが傾かないように制御できます。
Unityでの実装例(C#コード)
Unityでカメラ制御を実装する具体的な例を見ていきましょう。
滑らかな追従カメラクラス
|
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 |
using UnityEngine; public class SmoothFollowCamera : MonoBehaviour { [Header("追従設定")] public Transform target; public Vector3 offset = new Vector3(0, 5, -10); public float smoothSpeed = 5.0f; [Header("回転設定")] public bool allowRotation = false; public float rotationSpeed = 50.0f; private float currentHorizontalAngle = 0f; void LateUpdate() { if (target == null) return; // 回転入力の処理 if (allowRotation) { float mouseX = Input.GetAxis("Mouse X") * rotationSpeed * Time.deltaTime; currentHorizontalAngle += mouseX; } // オフセットを回転 Quaternion rotation = Quaternion.Euler(0, currentHorizontalAngle, 0); Vector3 rotatedOffset = rotation * offset; // 目標位置を計算 Vector3 desiredPosition = target.position + rotatedOffset; // 滑らかに移動 transform.position = Vector3.Lerp(transform.position, desiredPosition, smoothSpeed * Time.deltaTime); // 対象を見る transform.LookAt(target); } } |
このクラスでは、オフセットを回転させることで、カメラを対象の周りで回転させられます。
回転カメラクラス
|
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 58 59 60 |
using UnityEngine; public class OrbitCamera : MonoBehaviour { [Header("対象設定")] public Transform target; [Header("距離と角度")] public float distance = 10.0f; public float minDistance = 3.0f; public float maxDistance = 20.0f; [Header("回転制御")] public float horizontalSpeed = 100.0f; public float verticalSpeed = 100.0f; public float minVerticalAngle = -80f; public float maxVerticalAngle = 80f; private float horizontalAngle = 0f; private float verticalAngle = 30f; void Start() { // 初期角度を計算 Vector3 direction = (transform.position - target.position).normalized; horizontalAngle = Mathf.Atan2(direction.x, direction.z) * Mathf.Rad2Deg; verticalAngle = Mathf.Asin(direction.y) * Mathf.Rad2Deg; } void LateUpdate() { if (target == null) return; // マウス入力を取得 float mouseX = Input.GetAxis("Mouse X") * horizontalSpeed * Time.deltaTime; float mouseY = Input.GetAxis("Mouse Y") * verticalSpeed * Time.deltaTime; // 角度を更新 horizontalAngle += mouseX; verticalAngle -= mouseY; verticalAngle = Mathf.Clamp(verticalAngle, minVerticalAngle, maxVerticalAngle); // 距離を調整(マウスホイール) float scroll = Input.GetAxis("Mouse ScrollWheel"); distance -= scroll * 5.0f; distance = Mathf.Clamp(distance, minDistance, maxDistance); // 球面座標から位置を計算 float hRadian = horizontalAngle * Mathf.Deg2Rad; float vRadian = verticalAngle * Mathf.Deg2Rad; float x = target.position.x + distance * Mathf.Cos(vRadian) * Mathf.Sin(hRadian); float y = target.position.y + distance * Mathf.Sin(vRadian); float z = target.position.z + distance * Mathf.Cos(vRadian) * Mathf.Cos(hRadian); transform.position = new Vector3(x, y, z); transform.LookAt(target); } } |
このクラスでは、球面座標を使ってカメラを配置し、マウス入力で回転と距離を制御できます。
- LateUpdateを使うことで、プレイヤーの移動後にカメラを更新できる
- 補間を使う場合は、Time.deltaTimeを掛けることを忘れない
- 角度の計算では、度とラジアンの変換に注意する
- カメラの向きは、LookAtを使うか、方向ベクトルからクォータニオンを計算する
カメラ制御の実装手順
※この順番を守らずに作り始めると、だいたい後で全部作り直すことになります。
- STEP1カメラの種類を決定
どのようなカメラ制御が必要か決定します。追従カメラ、回転カメラ、FPSカメラなど、ゲームの種類に応じて選択しましょう。
- STEP2座標変換の理解
ワールド座標とビュー座標の変換を理解します。Unityのカメラシステムの仕組みを把握しましょう。
- STEP3基本実装
最もシンプルな実装から始めます。固定位置のカメラや、直接追従するカメラを実装しましょう。
- STEP4補間の追加
カメラの動きを滑らかにするため、補間を追加します。LerpやSlerpを使って、滑らかな移動を実現しましょう。
- STEP5最適化と調整
パラメータを調整して、カメラの動きを最適化します。感度や速度、制限などを調整して、快適な操作感を実現しましょう。
よくある問題と解決方法
カメラ制御を実装する際によくある問題と、その解決方法を紹介します。
カメラがプレイヤーと重なる
カメラとプレイヤーの間にオフセットを設定します。
|
1 2 3 4 5 6 |
// ✅ 正しい実装 transform.position = target.position + offset; // ❌ 間違った実装 transform.position = target.position; // 重なってしまう |
適切なオフセットを設定することで、カメラが適切な位置に配置されます。
カメラが滑らかに動かない
補間を使うことで、カメラの動きを滑らかにできます。
|
1 2 3 4 5 6 |
// ✅ 滑らかな動き transform.position = Vector3.Lerp(transform.position, desiredPosition, smoothSpeed * Time.deltaTime); // ❌ カクつく動き transform.position = desiredPosition; // 即座に移動 |
Time.deltaTimeを掛けることで、フレームレートに依存しない滑らかな動きになります。
カメラが回転時に傾く
上方ベクトルを指定することで、カメラの傾きを防げます。
|
1 2 3 |
Vector3 direction = (target.position - transform.position).normalized; transform.rotation = Quaternion.LookRotation(direction, Vector3.up); |
Quaternion.LookRotationの第2引数で上方向を指定できます。
カメラが壁を通り抜ける
レイキャストを使って、壁との衝突を検出します。
|
1 2 3 4 5 6 7 8 9 10 |
Vector3 direction = target.position - transform.position; float distance = direction.magnitude; RaycastHit hit; if (Physics.Raycast(target.position, -direction, out hit, distance)) { // 壁にぶつかった場合は、壁の手前に配置 transform.position = hit.point + direction.normalized * 0.5f; } |
これにより、カメラが壁を通り抜けることを防げます。
- カメラが重なる → オフセットを設定する
- 動きが滑らかでない → 補間を使う、Time.deltaTimeを掛ける
- カメラが傾く → 上方向ベクトルを指定する
- 壁を通り抜ける → レイキャストで衝突を検出する
カメラ制御の学習を深めるには
カメラ制御の基礎を理解した後は、さらに深く学んでいくことが大切です。
Unity入門の森では、ゲーム開発に必要な知識を体系的に学べる環境が整っています。
特に、FPSゲーム講座(弓矢3D)では、FPSカメラだけでなく、様々なカメラ制御を学べます。
また、永久会員チケットでは、ゲーム開発全般に関する知識を幅広くカバーしているため、カメラ制御以外にも応用できる知識が身につきます。
カメラ制御の基礎から応用まで、実際のコードと紐付けて学べるので、理解が深まりやすいはずです。
- カメラ制御の基本的な概念と種類
- 座標変換の基礎(ワールド座標とビュー座標)
- 追従カメラと回転カメラの実装方法
- Unityでの実装例(C#コード)
- よくある問題と解決方法
記事を読んで「作ってみたい!」と思ったら!人気ゲームを題材にした講座で実力をつけよう
知識を読むだけで終わらせるのはもったいない。実際に手を動かしてゲームを1本完成させることで、理解が一気に深まります。人気タイトルをモデルにした講座で、ゲーム開発の第一歩を踏み出しましょう。
Unity ノンフィールドRPG+スレスパ風JRPG講座【Unity6対応!トレンドのデッキ構築×JRPGをスマホ向けに作れる!】

- Unity6対応・スマホ化対応で最新環境のゲーム開発が学べる
- Slay the Spire風のデッキ構築システム×JRPGの組み合わせを実装
- 初心者でも取り組みやすい丁寧な解説構成
- ノンフィールドRPGとデッキ構築JRPGの2つを合わせて学ぶのがおすすめ
Unity ノンフィールドRPGの作り方講座+Slay the Spire風デッキ構築JRPGの作り方講座は、今もっともトレンドのデッキ構築型ゲームシステムをJRPGと組み合わせて実装する方法を学べる講座です。
Unity6対応・スマホ化対応の最新カリキュラムで、コラムやTIPSで読んで「なるほど」と思った知識を、実際に動くゲームとして形にする体験ができます。
「Slay the Spireみたいなゲームを自分でも作ってみたい!」という人の最初の一歩として最適な講座です。
Unity6対応・スマホ化対応の最新カリキュラム
トレンドのデッキ構築×JRPGを最速で実装しよう
→ スレスパ風デッキ構築JRPG講座を見てみる
スマホ対応の最新環境で、ゲーム開発の第一歩を踏み出そう!
Unity 2Dアクションゲームの作り方講座(ロックマン風)【全16回!スマホ化・広告実装まで対応した本格横スクロールACTを作れる!】

- ロックマン・マリオ・カービィのような横スクロールACTをゼロから開発
- 7ステージ+ラスボスステージの市販ゲームに近い本格的なゲーム設計
- スマホ化・AdMob広告実装まで対応してリリースまで見据えた構成
- 敵AI15体・多彩なマップギミック・武器システムを完全実装
- 完全オリジナルゲームをアセット不使用で素材提供付きで制作
Unity 2Dアクションゲームの作り方講座(ロックマン風)は、ロックマン・スーパーマリオ・星のカービィのような2D横スクロールアクションゲームを開発できるようになる本格的な講座です。
TIPSやコラムで学んだ当たり判定・物理挙動・敵AIの知識を、実際のゲームコードとして実装する体験が全16回に凝縮されています。スマホ化・広告実装まで対応しているため、作って終わりではなくリリースまで見据えた実践スキルが身につきます。
「読んで理解した知識を、動くゲームとして形にしたい」という人に強くおすすめの一本です。
スマホ化・広告実装まで対応した本格横スクロールACT
ロックマン風の2Dアクションゲームをリリースまで作り上げよう
→ 2Dアクションゲームの作り方講座を見てみる
広告収益まで視野に入れた実践スキルを今すぐ手に入れよう!
ゼルダ風3Dアクションゲームの作り方講座【全16回!初心者でも3Dアクションがスマホ対応で作れる!】

- ゼルダの伝説・モンハン・原神のような3Dアクションをゼロから開発
- 初心者でも取り組みやすい丁寧な解説構成
- スマホ化対応で実機で動かせるゲームが完成
- アセットを使った実践的なゲーム開発手法が身につく
- 画像・動画・全ソースコード公開の充実したサポート
ゼルダ風3Dアクションゲームの作り方講座は、ゼルダの伝説・モンハン・原神のような本格的な3Dアクションゲームを作りたい人におすすめの入門講座です。
コラム・TIPSで「3Dゲームはなんとなく難しそう」と感じていた人でも、全16回の丁寧な解説で確実に完成まで到達できます。スマホ化対応で実機で動かせるため、作った達成感がひときわ大きい講座です。
「3Dゲームの仕組みを理解した次は、実際に自分で作ってみたい」という人の最初の一歩として最適です。
初心者でも3Dアクションがスマホ対応で完成する
ゼルダ風3Dアクションゲームで3D開発の第一歩を踏み出そう
→ ゼルダ風3Dアクションゲームの作り方講座を見てみる
3D開発の壁を一気に突破!スマホで動くオリジナルゲームを完成させよう!
まとめ

この記事では、ゲーム開発で必須のカメラ制御の数学について解説しました。
カメラ制御は、座標変換やベクトル計算などの数学知識が必要ですが、基本的な仕組みを理解すれば実装できます。
追従カメラや回転カメラなど、様々なカメラ制御を組み合わせることで、ゲームに最適な視点を実現できます。
「カメラ制御って難しそう💧」と感じる方もいるかもしれませんが、Unityの便利な機能を使えば、比較的簡単に実装できます。
まずはシンプルな追従カメラから始めて、徐々に複雑な制御に挑戦していきましょう。
- カメラ制御は、3D空間内でカメラの位置と向きを制御する技術
- ワールド座標とビュー座標の変換を理解することが重要
- 補間を使うことで、滑らかなカメラ移動を実現できる
- LateUpdateを使うことで、プレイヤーの移動後にカメラを更新できる
- 適切なオフセットと補間パラメータの調整が重要
まずは基本的な実装から始めて、徐々に応用的な機能に挑戦していきましょう。
Unity入門の森では、カメラ制御の基礎から応用まで、実践的な知識を体系的に学べる環境が整っています。
疑問があれば、ぜひ活用してみてください。
あなたのオリジナルゲーム、今年こそ完成させませんか?
RPG・アクション・ホラー…Unityで本格ゲームを作りたい人のための学習サイトです。
実際に完成するゲームを題材に、
ソースコード・素材・プロジェクト一式をすべて公開。
仕事や学校の合間の1〜2時間でも、
「写経→改造」で自分のゲームまで作りきれる環境です。





コメント