The Cinematic Camera

The garage camera is what makes the Tuner feel like a showroom instead of a menu: every category swings the view to a purpose-built shot, the player can orbit and zoom, and an idle camera slowly circles the car. This chapter explains how the takeover works, how to author the camera in your scene, and how to design your own shots.

How the Takeover Works

When the garage opens, RCCPT_CameraDirector takes over cleanly:

  1. It activates its own camera (an authored one if you provide it, else one spawned at runtime that copies your gameplay camera's settings).
  2. It disables your gameplay camera rig wholesale - it never fights another camera script frame-by-frame.
  3. It then switches off every other screen-rendering camera in the scene, and every foreign AudioListener (the component that acts as the player's ears - a scene may only sensibly have one). Step 2 covers exactly one rig, the one the director resolved as the source; anything else still live would keep drawing over the garage and would leave two listeners running, which Unity warns about and which makes positional audio undefined. Cameras that render into a Render Texture - mirrors, minimaps, render-to-UI - are deliberately left alone, because they never compete for the screen. This is the Suppress Other Cameras switch, on by default.
  4. On close, everything is restored exactly: the spawned camera is destroyed (or the authored one disabled again), the original rig is re-activated in its prior state, and every camera and listener suppressed in step 3 is switched back on.

All camera motion runs on unscaled time, and the director never touches Time.timeScale - the garage behaves identically in slow motion, pause menus, or bullet-time.

Zero-Setup vs Authored Camera

Mode How When to use
Runtime spawn (default) Have no RCCPT_CameraDirector in the scene (or one without a Scene Camera). A camera is created on open, copying the live gameplay camera's settings Drop-in setups; prototypes
Authored scene camera Place an RCCPT_CameraDirector and assign a child camera to its Scene Camera slot (the demo scene does this - the child is RCCPT_GarageCamera) When you need control: post processing, culling mask, HDR settings, clear flags - author them directly on that Camera component

You do not have to disable the authored camera yourself, and the demo scene ships it enabled so you can frame the shot in the Scene view. The director calls SetActive(false) on it in Awake, so it is asleep before the first frame renders and never fights your gameplay camera; it wakes on open and goes back to sleep on close. Assign the director to the controller's Camera Director slot, or just leave it in the scene - the controller finds it.

Director Settings

The camera director in the demo scene, with the authored garage camera as its child

Setting Default Description
Scene Camera (empty) Pre-placed garage camera. Empty = a camera is spawned at runtime, copying the gameplay camera's settings
Copy Gameplay Camera Settings off When a scene camera is assigned, still copy the gameplay camera's settings over it on takeover. Off = the scene camera keeps its authored settings
Suppress Other Cameras on While the garage is open, disable every other screen-rendering camera and every foreign AudioListener, then restore them on close. Cameras rendering into a Render Texture (mirrors, minimaps) are exempt. Turn it off only if your scene deliberately draws another camera on top of the garage
Override Field Of View off Use one fixed FOV for every shot instead of each shot's own value - the switch to flip if you just want to change the FOV globally
Field Of View 55 (range 20-100) The FOV used while the override is enabled
Orbit Sensitivity 0.25 Orbit degrees per pixel of pointer drag
Zoom Sensitivity 0.08 Zoom fraction applied per scroll step / pinch unit
Idle Seconds Before Auto Orbit 6 Seconds without input before idle-orbit shots start rotating
Follow Responsiveness 12 (range 1-30) How quickly the camera chases its target pose (higher = snappier, lower = floatier)

Shots and the Shot Library

Three words do the work in this chapter, so pin them down first:

Term What it is
Category One tab in the garage's left rail - Paint, Wheels, Engine and so on. There are 11
Shot kind A named framing slot - Overview, Front, FrontWheel, Hood... There are 10, and they are fixed by the RCCPT_ShotKind enum in code
Anchor The world point a shot kind resolves to on the actual car - the bounds centre, a wheel model, the active spoiler

The library maps category to shot kind; the shot kind then picks its anchor automatically on whatever vehicle is loaded.

A shot is one authored framing. The clever part: distances are expressed as multiples of the vehicle's bounds, so the same shot correctly frames a kart or a truck with zero per-vehicle setup.

The table below lists each field with the value a freshly added shot starts from (the shipped library authors different numbers per shot - open Resources/RCCPT_ShotLibrary_Default in the inspector to read them):

Shot field New-shot default Meaning
Kind Overview Which auto-resolved anchor this shot frames (see below)
Distance Mul 2.75 Camera distance as a literal multiple of the vehicle's max bounds extent: distance = extent x distanceMul x zoom
Height Mul 0.65 Raises the camera above the shot pose. This is a weight, not a literal multiple like Distance Mul: the lift applied is extent x heightMul x 0.35, so 0.65 raises the camera by about 0.23 of the bounds extent, not 0.65 of it. The shot keeps aiming at its anchor, so higher values look down more
Yaw Deg -35 Base yaw around the vehicle: 0 frames the front of the car, +/-180 the rear; negative values move the camera to the car's left side. See the diagram below
Pitch Deg 12 Base pitch (positive looks down)
Fov 55 Field of view for this shot
Orbit Yaw Range -180 to 180 How far the player may orbit around the base yaw
Orbit Pitch Range -5 to 45 Player pitch limits
Zoom Range 0.6 to 1.6 Player zoom multiplier limits on the shot distance
Blend Duration 0.8 Seconds to blend into this shot (unscaled)
Idle Auto Orbit off Slowly auto-orbit after the idle delay
Auto Orbit Speed 4 Idle orbit speed, degrees per second

Yaw is the one value that trips everybody up, because 0 does not put the camera behind the car - it puts the camera in front of it, looking at its nose. This diagram is the whole rule:

Top-down ring of yaw values around the car, with the shipped Front, Side and Rear shots marked

Shots are collected in an RCCPT_ShotLibrary asset (Assets > Create > BoneCracker Games > RCCP Tuner > Shot Library) together with the category -> shot routing. Assign your library on RCCPT_Settings (project default) or the controller (per scene); the Settings inspector marks the slot with a status glyph and can find the asset for you with its Locate button, and the controller inspector shows which library each scene actually ends up using - see Editor Tools.

There are three fallbacks, and only the first two are gentle:

What is missing What happens
A category is not in the routing That category is framed by the Overview shot
A shot kind is not in the library Any category routed to it is framed by the Overview shot
No library resolves at all (no override, no project default) Every category is framed by one built-in shot at the new-shot defaults above (distance 2.75, height 0.65, yaw -35, pitch 12, FOV 55), and switching categories no longer moves the camera at all

⚠ That third case is silent - no error, no warning in the console, just a garage whose camera never reacts. If the camera feels dead, check the Shots row in the Tuner Controller inspector: it reads none — the camera director uses built-in framings when nothing resolved.

An Overview shot is therefore load-bearing, because it is the target of the first two fallbacks. Author a library without one and every category that was relying on that fallback drops through to the built-in defaults instead - the categories you did route to authored shots still work, which is what makes the gap easy to miss. The library inspector flags a missing Overview as an error for exactly that reason.

What the Shipped Library Does

The default library (Resources/RCCPT_ShotLibrary_Default) authors 10 shots and routes all 11 categories like this:

How the shipped library routes each category to a shot, with the framing of each shot

Category Shot Character
Paint Front Front three-quarter, slow idle orbit
Wheels, Brake Front Wheel Low, close, at the actual front wheel
Engine Hood Over the hood
Handling, Speed Overview Wide three-quarter, slow idle orbit
Spoiler Spoiler Rear three-quarter at the active spoiler
Siren Top High look-down
Decal Side Broadside profile
Neon, Tuning Underglow Low and wide at the floor line

Two things about that table are worth knowing before you author your own:

Where Shots Aim: Automatic Anchors

Each shot kind resolves its focus point on any RCCP vehicle automatically, with no per-vehicle setup. "Bounds" below means the combined world-space bounds of the vehicle's active mesh renderers:

Shot kind Aims at
Overview The bounds centre
Front Ahead of the centre, roughly at the nose
Rear Behind the centre, roughly at the tail
Front Wheel The front axle's actual wheel model transform, preferring the left wheel because the shipped shots orbit to the car's left. Falls back to the right wheel, then to a point derived from the bounds if the axle has no wheel model
Rear Wheel The rear axle's wheel model, same preference and same fallbacks
Spoiler The currently equipped spoiler object reported by RCCP's Spoiler Manager. With no spoiler fitted it falls back to the Rear anchor, raised
Underglow A point just above the floor line, under the centre of the car
Top The bounds centre (the shot's own high pitch does the looking-down)
Side The bounds centre
Hood Ahead of and above the centre, over the bonnet

Two rules apply on top of the table:

Per-Vehicle Fine-Tuning

For unusual vehicles (a limousine whose "spoiler" shot should frame something else, say), add the RCCPT_CameraAnchorOverride component to the vehicle and fill its rows: each row pairs a shot kind with a focus transform that wins over the auto-computed anchor for that kind. Vehicles without the component just use the automatic anchors.

Player Input

The invisible full-screen ViewportDrag layer behind the UI panels (component RCCPT_ViewportDrag) forwards input to the director: drag empty screen space (mouse or touch) to orbit, scroll or two-finger pinch to zoom - both clamped per shot. Pinch speed is tuned by Pinch Zoom Sensitivity on the ViewportDrag object (zoom units per screen-height of pinch travel, so it feels the same on every resolution); while two fingers are down the layer pinches only and never orbits. UI panels sit above it, so orbiting never fights buttons. After the idle delay, shots flagged with Idle Auto Orbit begin their slow rotation; any input pauses it again.

Recipe: Change the Whole Garage's FOV

  1. Select the RCCPT_CameraDirector in your scene (or add one).
  2. Tick Override Field Of View, set Field Of View.

Done - every shot now uses that FOV, no library editing needed.

Recipe: Author a Custom Shot Set

  1. Assets > Create > BoneCracker Games > RCCP Tuner > Shot Library.
  2. Select the new asset. Its inspector opens on a Shot Coverage panel that reads out which of the ten shot kinds you have authored. Use its buttons rather than the raw list: Add Overview Shot (offered as an error while Overview is missing, because everything falls back to it) and Add Missing Shots append entries seeded with the new-shot defaults from the table above. Do not add rows with Unity's + button - a hand-added list element arrives zero-filled, and a shot with Distance Mul 0 puts the camera inside the car.
  3. Tune each shot. Collapsed, every row titles itself with its own summary - Front dist x1.2 · yaw -25° · FOV 52 - instead of Unity's Element 0..N, so you can audit a whole library without expanding anything. Keep Distance Mul bounds-relative thinking: around 0.55 is "right at a wheel", 1.35 is "the whole car with air around it".
  4. Fill the Category Map - route each category you offer to a shot kind. The Category Routing panel below the coverage readout lists anything unrouted, anything pointing at a shot you never authored, and any category routed twice (only the first route is ever used). Full tour of the panel in Editor Tools.
  5. Assign the library on RCCPT_Settings (or a controller's Shot Library Override), then confirm the Shots row in the controller inspector names your asset - an unassigned library is the silent third fallback described above.
  6. Press Play and flip through categories to feel the framing; iterate.

Next Steps