概要
「カメラをキャラクターに追従させたい…」「複数のカメラをスムーズに切り替えたい…」「カメラシェイクを実装したい…」
そこで役立つのが、Cinemachine(シネマシン) です。Cinemachineは、Unityカメラを制御するための公式パッケージです。スクリプトを書かずに、高品質なカメラワークを実現できます。
動作確認環境: Unity 2022.3 LTS / Unity 6、Cinemachine 3.x
バージョンに関する注意: 本記事はCinemachine 3.x系を対象としています。Cinemachine 2.x系ではコンポーネント名やAPIが異なります(例:
CinemachineVirtualCamera→CinemachineCamera)。プロジェクトのバージョンを確認してください。
インストール方法
Cinemachineは、Package Managerからインストールできます。
- Unityエディタのメニューから「Window」→「Package Manager」を選択
- 左上のドロップダウンメニューから「Unity Registry」を選択
- リストから「Cinemachine」を探してクリック
- 右下の「Install」ボタンをクリック
Cinemachineの基本概念
Virtual Camera(仮想カメラ)
Virtual Cameraは、シーン内に配置する仮想的なカメラです。実際にはレンダリングを行わず、Main CameraのCinemachine Brainに対して位置・向き情報を送ります。
Virtual Cameraは、以下の3つの主要な要素で構成されています。
| 要素 | 説明 |
|---|---|
| Body | カメラの位置を制御(追跡、パス移動など) |
| Aim | カメラの向きを制御(注視、画面内配置など) |
| Noise | カメラシェイクや手ブレを追加 |
Cinemachine Brain(シネマシンブレイン)
Cinemachine Brainは、Main Cameraにアタッチするコンポーネントです。シーン内のすべてのVirtual Cameraを管理し、どのVirtual Cameraをアクティブにするかを決定します。
Virtual Cameraの基本的な使い方
Virtual Cameraの作成
- Hierarchyウィンドウで右クリック
- 「Cinemachine」→「Cinemachine Camera」を選択
ターゲットの設定
| ターゲット | 説明 |
|---|---|
| Tracking Target | カメラが追跡するターゲット(Body設定に影響) |
| Look At Target | カメラが注視するターゲット(Aim設定に 影響) |
主なBodyタイプ
| タイプ | 用途 |
|---|---|
| Do Nothing | 位置を固定 |
| Follow | ターゲットを追跡(3Dゲーム向け) |
| Position Composer | 画面内の特定位置に配置(2Dゲーム向け) |
| Orbital Follow | ターゲットの周囲を回転 |
| Third Person Follow | TPSゲーム向け、肩越しカメラ |
| Spline Dolly | パスに沿って移動 |
Third Person Follow(TPSカメラ)
TPSゲームで最も使われるカメラタイプです。プレイヤーの肩越しにカメラを配置し、照準操作に対応します。
- Cinemachine Cameraを作成
- Body を「Third Person Follow」に設定
- パラメータを調整:
- Shoulder Offset: 肩からのオフセット(例:0.5, 0, 0で右肩越し)
- Camera Distance: プレイヤーからの距離
- Damping: 追従の滑らかさ
Cinemachine 2.xからの変更点: 2.x系では
Framing TransposerやTransposerなどの名前でしたが、3.x系ではPosition ComposerやFollowに変更されています。
実践的な使用例
例1:キャラクターを追従するカメラ
- Cinemachine Cameraを作成
- 以下を設定:
- Tracking Target: キャラクターのTransform
- Look At Target: キャラクターのTransform
- Body: Follow
- Follow Offset: (0, 2, -5)
- Aim: Composer
例2:複数のカメラをスムーズに切り替える
using UnityEngine;
using Unity.Cinemachine;
public class CameraSwitcher : MonoBehaviour
{
[SerializeField] private CinemachineCamera camera1;
[SerializeField] private CinemachineCamera camera2;
void Update()
{
if (Input.GetKeyDown(KeyCode.Alpha1))
{
camera1.Priority.Value = 15;
camera2.Priority.Value = 5;
}
else if (Input.GetKeyDown(KeyCode.Alpha2))
{
camera1.Priority.Value = 5;
camera2.Priority.Value = 15;
}
}
}
例3:カメラシェイクを実装する
- Virtual Cameraを選択
- 「Add Extension」→「Cinemachine Basic Multi Channel Perlin」を選択
- Noise Profile を設定(重要):
- 「Noise Profile」フィールドの右にある○ボタンをクリック
- 「6D Shake」などのプリセットを選択(Noise Profileが未設定だとシェイクが動作しません)
- パラメータを設定:
- Amplitude Gain: 1.0(振幅)
- Frequency Gain: 1.0(周波数)
重要: Noise Profileを設定しないと、AmplitudeやFrequencyを変更してもシェイクが発生しません。Unityに付属の「6D Shake」「Handheld_normal_mild」などのプリセットを使うか、独自のNoiseSettingsア セットを作成してください。
using UnityEngine;
using Unity.Cinemachine;
public class CameraShake : MonoBehaviour
{
[SerializeField] private CinemachineCamera virtualCamera;
private CinemachineBasicMultiChannelPerlin noise;
void Awake()
{
// Extensionからノイズコンポーネントを取得
noise = virtualCamera.GetComponent<CinemachineBasicMultiChannelPerlin>();
}
public void Shake(float amplitude, float frequency, float duration)
{
if (noise == null) return;
noise.AmplitudeGain = amplitude;
noise.FrequencyGain = frequency;
Invoke(nameof(StopShake), duration);
}
void StopShake()
{
noise.AmplitudeGain = 0f;
noise.FrequencyGain = 0f;
}
}
例4:障害物を避けるカメラ
- Virtual Cameraを選択
- 「Add Extension」→「Cinemachine Deoccluder」を選択
- 「Collide Against」に障害物のレイヤーを設定
Input Systemとの連携
Orbital FollowやThird Person Followでプレイヤー入力によるカメラ回転を実装するには、CinemachineInputAxisController を使用します。
設定手順
- Virtual Cameraに「Add Component」→「Cinemachine Input Axis Controller」を追加
- Input Actionsアセットを作成し、Look(Vector2)アクションを設定
- CinemachineInputAxisControllerの「Input Action」に割り当て
コード例(スクリプトから制御する場合)
using UnityEngine;
using UnityEngine.InputSystem;
using Unity.Cinemachine;
public class CameraLookController : MonoBehaviour
{
[SerializeField] private CinemachineCamera virtualCamera;
[SerializeField] private InputActionReference lookAction;
private CinemachineOrbitalFollow orbitalFollow;
void Awake()
{
orbitalFollow = virtualCamera.GetComponent<CinemachineOrbitalFollow>();
}
void OnEnable() => lookAction.action.Enable();
void OnDisable() => lookAction.action.Disable();
void Update()
{
Vector2 lookInput = lookAction.action.ReadValue<Vector2>();
// Orbital Followの水平回転を更新
orbitalFollow.HorizontalAxis.Value += lookInput.x * Time.deltaTime * 100f;
}
}
注意: New Input Systemを使用する場合は、Project SettingsでInput System Packageを有効にしてください。
Extensions(拡張機能)
| 拡張機能 | 用途 |
|---|---|
| Cinemachine Deoccluder | 障害物を避けてカメラを移動 |
| Cinemachine Basic Multi Channel Perlin | 継続的なカメラシェイク(手ブレ、振動) |
| Cinemachine Impulse Source | 瞬間的なカメラシェイク(爆発、ヒット) |
| Cinemachine Follow Zoom | 距離に応じてFOVを変更 |
| Cinemachine Confiner 2D/3D | カメラをエリア内に制限 |
Impulse Source(瞬間的なシェイク)
爆発やダメージ時の瞬間的なカメラシェイクには、Impulse Systemが適しています。
using UnityEngine;
using Unity.Cinemachine;
public class ExplosionShake : MonoBehaviour
{
[SerializeField] private CinemachineImpulseSource impulseSource;
public void Explode()
{
// 爆発位置から衝撃を発生
impulseSource.GenerateImpulse();
}
}
- 空のGameObjectに「Cinemachine Impulse Source」を追加
- Virtual Cameraに「Cinemachine Impulse Listener」を追加
- スクリプトから
GenerateImpulse()を呼び出す
Timelineとの統合
CinemachineとTimelineを組み合わせることで、カットシーンやイベント演出を簡単に作成できます。
- Timelineウィンドウを開く(Window → Sequencing → Timeline)
- TimelineにCinemachine Trackを追加
- Cinemachine Trackに複数のVirtual Cameraをドラッグ&ドロップ
- Virtual Cameraの配置と長さを調整
ベストプラクティス
- Virtual Cameraの命名規則を統一する - 「VCam_Follow」「VCam_Boss」など
- Priorityを適切に設定する - 10刻みで設定すると後から挿入しやすい
- Dampingを調整して滑らかさを制御する - アクションゲームは小さめ、アドベンチャーは大きめ
- Blend Timeを調整する - 通常は1〜2秒程度が自然
- Extensionsを活用する - 障害物回避、カメラシェイク、エリア制限など
まとめ
Cinemachineは、Unityカメラを制御するための強力なツールです。
- スクリプトなしでカメラワークを実装できる - インスペクターで設定するだけ
- アニメーションや地形の変更に自動対応する - 手動調整が不要
- 高品質なカメラワークを短時間で実現できる - 追従、切り替え、シェイク、障害物回避
- Timelineとの統合で映画的な演出が可能 - カットシーンやイベント演出
ぜひ、Cinemachineを活用して、映画的なカメラワークを実現してください。