本文へ移動
cccskills
無料GitHub で公開

unity-cinemachine

Unity 6 Cinemachine camera system guide. Use when working with virtual cameras, camera blending, follow cameras, FreeLook, camera shake, or state-driven cameras. Covers Cinemachine 3.x API. Based on Unity 6.3 LTS documentation.

インストール方法を見る

含まれるファイル(2)

  • SKILL.md14.5 KB
  • references/cinemachine-api.md8.6 KB

SKILL.md(原文)

インストールする前に、エージェントに与えられる指示の中身を確認できます。

Unity Cinemachine (Camera System)

Based on Unity 6.3 LTS -- Cinemachine 3.1 package IMPORTANT: Cinemachine 3.x renamed CinemachineVirtualCamera to CinemachineCamera

Core Concepts

Cinemachine procedurally controls the Unity camera at runtime. Compose camera behaviors from reusable components instead of writing custom camera scripts.

Architecture

  1. CinemachineBrain -- On Main Camera; drives the Unity Camera from the highest-priority active CinemachineCamera
  2. CinemachineCamera -- Lightweight virtual camera describing desired position, rotation, and lens (replaces CinemachineVirtualCamera from v2)
  3. Priority System -- Highest-priority enabled CinemachineCamera wins
  4. Pipeline Stages -- Body (position), Aim (rotation), Noise stages compute the final camera state

Namespace

using Unity.Cinemachine;  // Cinemachine 3.x (NOT "using Cinemachine;")

Minimal Setup

  1. Add CinemachineBrain to Main Camera
  2. Create GameObject with CinemachineCamera
  3. Set Follow target and optionally LookAt target
  4. Add Body/Aim components as needed
using UnityEngine;
using Unity.Cinemachine;

public class CameraSetup : MonoBehaviour
{
    [SerializeField] Transform playerTransform;

    void Start()
    {
        var vcam = gameObject.AddComponent<CinemachineCamera>();
        vcam.Follow = playerTransform;
        vcam.LookAt = playerTransform;
        vcam.Priority.Value = 10;
    }
}

Camera Setup Patterns

Basic Follow Camera

CinemachineCamera + CinemachineFollow. Set Follow target to player.

// CinemachineFollow provides a simple offset-based follow
var follow = gameObject.AddComponent<CinemachineFollow>();
follow.FollowOffset = new Vector3(0f, 5f, -10f);
follow.Damping = new Vector3(1f, 1f, 1f);

Third-Person Camera

CinemachineThirdPersonFollow for collision-aware third-person cameras.

PropertyDescription
ShoulderOffsetOffset from follow target in local space
CameraDistanceDistance from shoulder point
CameraSide0=left, 0.5=center, 1=right
CameraRadiusCollision detection radius
DampingIntoCollisionDamping when moving closer due to collision
DampingFromCollisionDamping when returning after collision

Orbital / FreeLook Camera

CinemachineOrbitalFollow for orbit-around-target cameras controlled by player input. In Cinemachine 3.x, FreeLook is no longer a separate component -- use CinemachineCamera + CinemachineOrbitalFollow + CinemachineInputAxisController.

var orbital = gameObject.AddComponent<CinemachineOrbitalFollow>();
orbital.OrbitStyle = CinemachineOrbitalFollow.OrbitStyles.ThreeRing;
orbital.Radius = 5f;
// Add CinemachineInputAxisController to wire Input System actions
gameObject.AddComponent<CinemachineInputAxisController>();

2D Camera

CinemachinePositionComposer with dead zones and damping for smooth 2D tracking.

var composer = gameObject.AddComponent<CinemachinePositionComposer>();
composer.Damping = new Vector3(1f, 0.5f, 0f);
composer.DeadZoneWidth = 0.1f;
composer.DeadZoneHeight = 0.1f;
composer.ScreenPosition = new Vector2(0.5f, 0.5f);
composer.CameraDistance = 10f;  // orthographic distance

Body Components (Position Tracking)

Body components control how the camera position follows the target. Add one Body component per CinemachineCamera.

ComponentUse Case
CinemachineFollowSimple offset follow with damping
CinemachineThirdPersonFollowCollision-aware third-person
CinemachineOrbitalFollowOrbit around target (FreeLook style)
CinemachinePositionComposerScreen-space framing with dead zones
CinemachineHardLockToTargetSnap position exactly to target (no damping)
CinemachineTrackedDollyFollow a SplineContainer path

CinemachineTrackedDolly

Moves the camera along a SplineContainer path. Useful for cutscene rails, racing games, or side-scrollers.

var dolly = gameObject.AddComponent<CinemachineTrackedDolly>();
dolly.SplinePath = splineContainer;
dolly.AutoDolly.Enabled = true;      // auto-position along spline
dolly.CameraPosition = 0.5f;        // 0..1 position on spline
dolly.Damping = new Vector3(1f, 1f, 1f);

Aim Components (Rotation)

Aim components control how the camera rotates toward its LookAt target. Add one Aim component per CinemachineCamera.

ComponentUse Case
CinemachineRotationComposerSoft-zone aim with dead zones and damping
CinemachineHardLookAtAlways face target exactly (no damping)
CinemachinePanTiltManual pan/tilt via input axes (first-person)
CinemachineGroupFramingAuto-frame a CinemachineTargetGroup

CinemachinePanTilt

For first-person or manual-aim cameras:

var panTilt = gameObject.AddComponent<CinemachinePanTilt>();
panTilt.TiltAxis.Range = new Vector2(-70f, 70f); // clamp vertical look

Camera Blending

CinemachineBrain handles smooth transitions automatically.

Blend Styles

StyleDescription
CutInstant switch
EaseInOutSmooth acceleration/deceleration (most common)
EaseIn / EaseOutOne-sided easing
HardIn / HardOutHard start or end
LinearConstant speed
CustomUser-defined AnimationCurve

Switching Cameras

// Priority-based: Brain blends to highest priority
closeUpCamera.Priority.Value = 20;
wideCamera.Priority.Value = 10;

// Or enable/disable GameObjects -- Brain blends automatically
closeUpCamera.gameObject.SetActive(true);
wideCamera.gameObject.SetActive(false);

Custom per-camera-pair blends use a CinemachineBlenderSettings asset assigned to CinemachineBrain.CustomBlends.

State-Driven Cameras

CinemachineStateDrivenCamera maps Animator states to child CinemachineCameras. When the Animator transitions, the corresponding camera activates automatically.

Setup

  1. Create a parent GameObject with CinemachineStateDrivenCamera
  2. Add child GameObjects, each with CinemachineCamera
  3. Assign the Animator that drives the state transitions
  4. Map each Animator state to a child camera in the Inspector

Use Cases

  • Combat -- Switch to over-shoulder cam when entering Combat Animator state
  • Vehicles -- Different cameras for driving vs. reversing
  • Stealth -- Wider FOV when in Crouch state
  • Dialogue -- Close-up camera for conversation states

Camera Shake (Impulse System)

ComponentRole
CinemachineImpulseSourceGenerates impulse signal at a position
CinemachineImpulseListenerReceives impulse on a CinemachineCamera

Generating Impulse

using UnityEngine;
using Unity.Cinemachine;

public class ExplosionShake : MonoBehaviour
{
    [SerializeField] CinemachineImpulseSource impulseSource;

    public void Explode()
    {
        impulseSource.GenerateImpulse();           // default velocity
        impulseSource.GenerateImpulse(3f);         // scaled intensity
        impulseSource.GenerateImpulse(Vector3.up); // directional
    }
}

Listener Properties

PropertyDescription
GainImpulse multiplier (0=ignore, 1=full)
Use2DDistanceUse 2D distance for falloff
ChannelMaskWhich impulse channels to receive

Noise (Procedural Shake)

CinemachineBasicMultiChannelPerlin adds continuous procedural noise (handheld feel, idle breathing).

ProfileUse Case
6D ShakeFull positional + rotational
Handheld_normal_mildSubtle handheld
Handheld_normal_strongPronounced handheld

CinemachineTargetGroup

Frame multiple targets with a single camera.

var group = gameObject.AddComponent<CinemachineTargetGroup>();
group.Targets = new CinemachineTargetGroup.Target[]
{
    new() { Object = player.transform, Weight = 1f, Radius = 1f },
    new() { Object = enemy.transform, Weight = 0.5f, Radius = 1f }
};
// Add CinemachineGroupFraming to the camera for auto-framing

Input Handling

Cinemachine 3.x uses InputAxis for camera control input. It integrates with Unity's Input System package.

CinemachineInputAxisController

Add this component alongside CinemachineOrbitalFollow or CinemachinePanTilt. It auto-discovers axes on sibling components and connects Input System actions.

Custom Input Provider

using UnityEngine;
using Unity.Cinemachine;
using System.Collections.Generic;

public class CustomCameraInput : MonoBehaviour, IInputAxisOwner
{
    [SerializeField] InputAxis horizontalAxis;
    [SerializeField] InputAxis verticalAxis;

    public void GetInputAxes(List<IInputAxisOwner.AxisDescriptor> axes)
    {
        axes.Add(new IInputAxisOwner.AxisDescriptor
        {
            DrivenAxis = () => ref horizontalAxis,
            Name = "Horizontal"
        });
        axes.Add(new IInputAxisOwner.AxisDescriptor
        {
            DrivenAxis = () => ref verticalAxis,
            Name = "Vertical"
        });
    }
}

Common Patterns

Third-Person with Collision Avoidance

var vcam = gameObject.AddComponent<CinemachineCamera>();
vcam.Follow = player; vcam.LookAt = player;

var tpFollow = gameObject.AddComponent<CinemachineThirdPersonFollow>();
tpFollow.ShoulderOffset = new Vector3(0.5f, 0f, 0f);
tpFollow.CameraDistance = 4f;
tpFollow.CameraSide = 1f;
tpFollow.CameraRadius = 0.2f;

var rotComposer = gameObject.AddComponent<CinemachineRotationComposer>();
rotComposer.Damping = new Vector2(0.5f, 0.5f);

Switching Cameras on Trigger Zones

using UnityEngine;
using Unity.Cinemachine;

public class CameraTriggerZone : MonoBehaviour
{
    [SerializeField] CinemachineCamera zoneCamera;
    [SerializeField] int activePriority = 20;
    [SerializeField] int inactivePriority = 0;

    void Start() => zoneCamera.Priority.Value = inactivePriority;

    void OnTriggerEnter(Collider other)
    {
        if (other.CompareTag("Player"))
            zoneCamera.Priority.Value = activePriority;
    }

    void OnTriggerExit(Collider other)
    {
        if (other.CompareTag("Player"))
            zoneCamera.Priority.Value = inactivePriority;
    }
}

Cutscene Camera Sequence

using UnityEngine;
using Unity.Cinemachine;
using System.Collections;

public class CutsceneSequence : MonoBehaviour
{
    [SerializeField] CinemachineCamera[] cameras;
    [SerializeField] float[] durations;

    public IEnumerator PlayCutscene()
    {
        for (int i = 0; i < cameras.Length; i++)
        {
            foreach (var cam in cameras) cam.Priority.Value = 0;
            cameras[i].Priority.Value = 100;
            yield return new WaitForSeconds(durations[i]);
        }
    }
}

Split-Screen Setup

// Each player: separate Camera + CinemachineBrain + CinemachineCamera
// Camera 1: Viewport Rect (0, 0, 0.5, 1) -- left half
// Camera 2: Viewport Rect (0.5, 0, 0.5, 1) -- right half
brain1.ChannelMask = OutputChannels.Channel01;
brain2.ChannelMask = OutputChannels.Channel02;
player1Cam.OutputChannel = OutputChannels.Channel01;
player2Cam.OutputChannel = OutputChannels.Channel02;

Camera Shake on Explosion

[SerializeField] CinemachineImpulseSource impulseSource;
[SerializeField] float shakeForce = 5f;

public void Detonate()
{
    impulseSource.GenerateImpulse(shakeForce);
}

Anti-Patterns

Anti-PatternDo This Instead
Using CinemachineVirtualCamera (v2)CinemachineCamera
using Cinemachine; namespaceusing Unity.Cinemachine;
Modifying Camera.main.transform directlyModify the CinemachineCamera; Brain drives the Camera
All cameras at same priorityGive distinct priorities
No CinemachineBrain on Main CameraAlways add CinemachineBrain
Manual Lerp for camera transitionsUse priority switching; Brain handles blending
CinemachineTransposer (v2)CinemachineFollow
CinemachineComposer (v2)CinemachineRotationComposer
CinemachineFramingTransposer (v2)CinemachinePositionComposer

Key API Quick Reference

ClassPurpose
CinemachineCameraVirtual camera (was CinemachineVirtualCamera)
CinemachineBrainDrives Unity Camera from active virtual camera
CinemachineFollowOffset body (was CinemachineTransposer)
CinemachineThirdPersonFollowCollision-aware third-person body
CinemachineOrbitalFollowOrbit body for FreeLook
CinemachinePositionComposerScreen-space framing (was FramingTransposer)
CinemachineTrackedDollyFollow a Spline path
CinemachineRotationComposerSoft-zone aim (was CinemachineComposer)
CinemachineHardLookAtSnap aim to target
CinemachinePanTiltManual pan/tilt aim
CinemachineGroupFramingAuto-frame target group
CinemachineImpulseSourceGenerate camera shake
CinemachineImpulseListenerReceive shake on camera
CinemachineBasicMultiChannelPerlinContinuous procedural noise
CinemachineStateDrivenCameraMap Animator states to cameras
CinemachineTargetGroupGroup multiple targets
CinemachineBlenderSettingsCustom blend definitions
CinemachineInputAxisControllerConnect Input System to axes
ICinemachineCameraInterface for virtual cameras

v2 to v3 Migration Reference

Cinemachine 2.xCinemachine 3.x
CinemachineVirtualCameraCinemachineCamera
CinemachineFreeLookCinemachineCamera + CinemachineOrbitalFollow
CinemachineTransposerCinemachineFollow
CinemachineComposerCinemachineRotationComposer
CinemachineFramingTransposerCinemachinePositionComposer
CinemachinePOVCinemachinePanTilt
CinemachineGroupComposerCinemachineGroupFraming
using Cinemachineusing Unity.Cinemachine
m_Follow / m_LookAtFollow / LookAt
m_PriorityPriority.Value

Related Skills

  • For animation state machines, see unity-animation
  • For rendering/cameras, see unity-graphics
  • For Timeline, see unity-animation references/timeline.md
  • For input system integration, see unity-input

Additional Resources

レビュー

まだレビューはありません。使ってみた感想をお寄せください。

同じリポジトリのスキル

概要と使いどころ

adopt

無料

Brownfield onboarding — audits existing project artifacts for template format compliance (not just existence), classifies gaps by impact, and produces a numbered migration plan. Run this when joining an in-progress project or upgrading from an older template version. Distinct from /project-stage-detect (which checks what exists) — this checks whether what exists will actually work with the template's skills.

日本語の概要は準備中です。原文の説明を表示しています。

IdoCohen560/claude-unity-game-studio222026年7月8日 更新

Creates an Architecture Decision Record (ADR) documenting a significant technical decision, its context, alternatives considered, and consequences. Every major technical choice should have an ADR.

日本語の概要は準備中です。原文の説明を表示しています。

IdoCohen560/claude-unity-game-studio222026年7月8日 更新

Validates completeness and consistency of the project architecture against all GDDs. Builds a traceability matrix mapping every GDD technical requirement to ADRs, identifies coverage gaps, detects cross-ADR conflicts, verifies engine compatibility consistency across all decisions, and produces a PASS/CONCERNS/FAIL verdict. The architecture equivalent of /design-review.

日本語の概要は準備中です。原文の説明を表示しています。

IdoCohen560/claude-unity-game-studio222026年7月8日 更新

art-bible

無料

Guided, section-by-section Art Bible authoring. Creates the visual identity specification that gates all asset production. Run after /brainstorm is approved and before /map-systems or any GDD authoring begins.

日本語の概要は準備中です。原文の説明を表示しています。

IdoCohen560/claude-unity-game-studio222026年7月8日 更新

Audits game assets for compliance with naming conventions, file size budgets, format standards, and pipeline requirements. Identifies orphaned assets, missing references, and standard violations.

日本語の概要は準備中です。原文の説明を表示しています。

IdoCohen560/claude-unity-game-studio222026年7月8日 更新

Generate per-asset visual specifications and AI generation prompts from GDDs, level docs, or character profiles. Produces structured spec files and updates the master asset manifest. Run after art bible and GDD/level design are approved, before production begins.

日本語の概要は準備中です。原文の説明を表示しています。

IdoCohen560/claude-unity-game-studio222026年7月8日 更新

IdoCohen560 のスキルをすべて見る

このスキルの問題を報告する