godot-camera-systems
Installation
SKILL.md
Camera Systems
Expert guidance for creating smooth, responsive cameras in 2D and 3D games.
NEVER Do
- NEVER use
global_position = target.global_positionevery frame — Instant position matching causes jittery movement. Uselerp()orposition_smoothing_enabled = true[12]. - NEVER use
offsetfor permanent camera positioning —offsetis for shake, sway, or temporary recoil effects only. Usepositionfor permanent framing to avoid logic conflicts [14]. - NEVER forget
limit_smoothed = trueforCamera2D— Hard boundaries cause jarring visual stops. Smoothing against limits ensures a professional feel [13]. - NEVER enable multiple
Camera2Dnodes in the same viewport simultaneously — Only the last enabled camera takes precedence. Explicitly disable inactive cameras [15]. - NEVER use
SpringArm3Dwithout a collision mask — It will clip through terrain and walls. Set it to the world/environment layer [16]. - NEVER implement screen shake by randomizing
positiondirectly — This overwrites follow-logic. Useoffsetor a dedicated Trauma/Noise system to Layer shake over the follow-position [27, 28]. - NEVER parent the Camera directly to a high-speed physics body — Physics stutter or parent rotation will cause motion sickness. Use
RemoteTransform2D/3Dwith rotation sync disabled for a stable view [30]. - NEVER use
look_at()in 3D without a fallback for the 'Up' vector — If the target is directly above/below, the camera will flip wildly. Use guards orQuaternionmath for vertical tracking. - NEVER rely on
SubViewportdefaults for Mini-maps — Viewports are expensive; explicitly setrender_target_update_modetoUPDATE_WHEN_VISIBLEor a fixed lower framerate to save GPU [156]. - NEVER use linear interpolation for Zoom — It feels 'robotic'. Use exponential lerp or a
TweenwithTRANS_CUBICfor a more natural tactical feel.