ScarEyeCam
Cinematic FPS camera system.
Your game does not feel real because your camera is not. ScarEyeCam is a first-person camera system built on spring physics, with five presets, a Shooter and Horror mode system, and deep Blueprint control: 149 editable properties, 36 callable functions and 27 events. Add the component, pick a preset, press Play.
- Engine support
- Unreal Engine 5.2, 5.3, 5.4, 5.5, 5.6 and 5.7
- Version
- 1.0
- Backends
- Not applicable
What you get
- Five camera presets: Realistic, Cinematic, Horror, Arcade and Tactical
- Shooter and Horror mode system with smooth blending
- 149 editable Blueprint properties, 36 callable functions, 27 events
- Sensitivity profiles: Low, Balanced, High and Custom
- ADS with FOV spring and sway reduction
- Sprint reactions, fire recoil with barrel drop, explosion response
- Horror: heartbeat, panic, glitch, post-process and environmental triggers
- Zero snapping: internal rotation pipeline with spring-based physics
What it feels like
Before any technical detail, here is what each preset delivers. ScarEyeCam is not a list of features. It is a feeling.
| Preset | The feel |
|---|---|
| Realistic | Smooth, grounded, believable. Feels like a real human carrying weight. Every step lands, every turn has momentum. |
| Cinematic | Heavy, slow, lingering. Every motion has purpose. Perfect for storytelling and walking simulators. |
| Horror | Unstable, breathing, unpredictable. You are not fully in control. The camera is alive and it is afraid. |
| Arcade | Fast, sharp, responsive. Zero delay, pure gameplay. The camera does exactly what you want, instantly. |
| Tactical | Tight, precise, controlled. Medium weight with surgical responsiveness. Built for competitive accuracy. |
Before and after
| Without ScarEyeCam | With ScarEyeCam |
|---|---|
| Instant, robotic camera movement | Physical movement with weight and momentum |
| No weight or inertia on any action | Spring-based inertia on every rotation and offset |
| Landing feels like nothing happened | Landing drops the camera with spring-back weight |
| Firing a weapon is just a crosshair flash | Recoil kicks, barrel drops, camera settles with weight |
| No emotional response from camera | Dynamic breathing, panic, heartbeat and instability |
| Every game feels the same | 5 presets, 2 modes, 149 properties: your game, your feel |
Who this is for
- FPS developers who want realistic, weighted camera feel without months of engineering.
- Horror creators who want player discomfort, tension and psychological dread baked into the camera.
- Indie devs who want AAA-level camera quality without complex setup or C++ knowledge.
- Marketplace asset creators who want a professional camera base to ship with their game templates.
- Prototypers who want instant physical camera feel: add component, pick preset, press Play.
Plugin installation
ScarEyeCam is distributed as an engine plugin through the Fab Marketplace. It installs directly into your Unreal Engine version and is available across all projects that use that engine version.
Step 1: purchase and install from Fab
- 01Open the Epic Games Launcher and navigate to the Fab Marketplace, or visit fab.com directly.
- 02Find ScarEyeCam by searching for "ScarEyeCam" in the marketplace search bar, and open the product page.
- 03Click Install to Engine and select the Unreal Engine version you want (5.2 through 5.7). The plugin downloads and installs automatically.
ScarEyeCam supports UE 5.2 through 5.7. Install it to whichever engine version your project uses. You can install to multiple engine versions simultaneously.
Step 2: enable the plugin in your project
- 01Open your game project in Unreal Editor using the engine version you installed the plugin to.
- 02Go to Edit > Plugins to open the Plugins browser window.
- 03Search for "ScarEyeCam". It appears under the Camera category.
- 04Click the Enable checkbox.
- 05Restart the editor when prompted. This is required for the plugin module to load.
After restart, ScarEyeCam is fully installed. The ScarEyeCam Component now appears in the Add Component menu of any Character Blueprint. No C++ code required, no project settings to change, and no Build.cs modifications needed.
Verifying installation
- 01Open any Character Blueprint.
- 02Click Add Component.
- 03Search for "ScarEyeCam". If ScarEyeCam Component appears in the list, installation is complete.
If the component does not appear, verify the plugin is enabled in Edit > Plugins and that you restarted the editor after enabling it.
Adding ScarEyeCam to your character
Once the plugin is installed and enabled, adding the camera system to your game takes under one minute: add the ScarEyeCam Component to your Character Blueprint, select a preset in the Details panel, and press Play. No Blueprint wiring, no timelines, no C++ code.
Detailed walkthrough
- 01Open your Character Blueprint. This is the Blueprint that inherits from ACharacter, for example BP_FirstPersonCharacter in the first-person template.
- 02Click + Add in the Components panel. Search for "ScarEyeCam Component" and add it. It appears under your root component.
- 03Select the ScarEyeCam component. The Details panel shows all ScarEyeCam properties organised by category.
- 04Under ScarEyeCam > Presets, set Camera Preset to your desired feel: Realistic, Cinematic, Horror, Arcade or Tactical.
- 05Under ScarEyeCam > Mode, check either Enable Shooter Mode or Enable Horror Mode. Modes are mutually exclusive.
- 06Compile, Save, and press Play. Walk, sprint, jump and turn. The camera responds with physical weight immediately.
The component auto-detects your CameraComponent. If you have multiple cameras, for example a weapon camera, assign the correct one to Target Camera in the Details panel.
Leave both Shooter and Horror mode unchecked to get neutral spring smoothing without mode-specific effects. Useful for testing or custom setups.
First time user quick start
Add component. Set preset to Realistic. Enable Shooter Mode. Compile. Press Play. You now have a fully responsive FPS camera with physical weight, sprint reactions, landing impacts, strafe tilt and recoil support. Customise from there.
Camera presets
Presets are one-click camera personalities that adjust six global pipeline controls simultaneously. Select one in the Details panel under ScarEyeCam > Presets, or call ApplyPreset() from any Blueprint at runtime.
| Preset | Smoothness | Weight | Response | Impact | Inertia | FOV |
|---|---|---|---|---|---|---|
| Realistic | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 90 |
| Cinematic | 1.6 | 1.5 | 0.7 | 0.8 | 1.4 | 85 |
| Horror | 1.3 | 1.3 | 0.6 | 0.7 | 1.6 | 80 |
| Arcade | 0.6 | 0.5 | 1.5 | 1.3 | 0.4 | 95 |
| Tactical | 0.9 | 0.8 | 1.2 | 1.0 | 0.7 | 88 |
Presets are starting points. After applying one, tweak individual values in the Details panel. Changes persist until another preset is applied.
Call ApplyPreset() at runtime to change feel during gameplay, for example Cinematic for cutscenes and Tactical for combat.
Sensitivity profiles
Control how player input translates to camera movement. Independent of presets. Editable under ScarEyeCam > Sensitivity in the Details panel.
| Property | Default | Range | Description |
|---|---|---|---|
| LookSensitivity | 1.0 | 0.1 - 5.0 | Rotation spring speed multiplier |
| AimSensitivity | 0.6 | 0.1 - 3.0 | Multiplies LookSensitivity during ADS |
| Acceleration | 0.0 | 0.0 - 1.0 | Input curve. 0 = linear, 1 = max acceleration |
Built-in profiles: Low (0.6 / 0.4 / 0), Balanced (1.0 / 0.6 / 0) and High (1.8 / 0.8 / 0.3). Retrieve them with GetDefaultSensitivityProfile("High").
Mode system (Shooter and Horror)
Two exclusive modes. Enabling one automatically disables the other. Toggle in the Details panel or call SetShooterMode() / SetHorrorMode() at runtime.
Shooter mode
Aggressive, clean, heavy impact. All horror systems are hard-gated off in code, not just via settings.
- Sprint reactions: camera punches forward on sprint entry, lurches on stop, with roll sway during sprint.
- Fire reactions: recoil kick with barrel-weight drop. Each shot feels heavy.
- Strafe tilt: camera rolls during lateral movement.
- ADS: FOV narrows, sway reduces, rotation tightens for precision.
Horror mode
Unstable, psychological, alive. The player never feels fully in control.
- Heartbeat: physical camera pulse at panic-driven BPM with FOV micro-pulse.
- Glitch: five types, being RotationJump, Jitter, MicroFreeze, PositionOffset and FreezeFrame.
- Post-process: vignette, chromatic aberration, desaturation, motion blur and exposure flicker.
- Panic: builds while moving, decays when still. Drives all horror systems.
- Horror triggers: nine types via TriggerHorrorEvent(), being Jumpscare, Whisper, Hallucination, Darkness, ChaseStart, ChaseEnd, EntityNearby, EnvironmentShift and Custom.
Master switches
- bEnableCameraSystem: global on/off. When false, the entire system is disabled.
- bEnableSmoothing: when false, spring smoothing is bypassed. Useful for A/B comparison.
All Blueprint callable functions
Call these from any Blueprint that has a reference to the ScarEyeCam component. Drag from the component pin in the Event Graph and search.
Presets and sensitivity
| Function | What it does |
|---|---|
| ApplyPreset(Preset) | Apply camera personality preset |
| ApplySensitivityProfile(Profile) | Apply sensitivity profile |
| GetDefaultSensitivityProfile(Name) | Get built-in: Low, Balanced or High |
Mode control
| Function | What it does |
|---|---|
| SetShooterMode(bool) | Enable or disable Shooter mode |
| SetHorrorMode(bool) | Enable or disable Horror mode |
Combat
| Function | What it does |
|---|---|
| AddRecoil(Pitch, Yaw) | Simple recoil kick |
| AddDirectionalRecoil(P, Y, R, Push) | Full recoil with roll and pushback |
| TriggerExplosionReaction(Loc, R, I) | Directional explosion push |
| EnterADS() | Enter aim-down-sights |
| ExitADS() | Exit aim-down-sights |
Horror
| Function | What it does |
|---|---|
| TriggerHorrorEvent(Type, Intensity) | Trigger typed horror event (9 types) |
| TriggerScare(Intensity) | Quick jumpscare shortcut |
| SetPanicLevel(0-1) | Manually override panic level |
Camera control
| Function | What it does |
|---|---|
| SetTargetFOV(float) | Override FOV manually |
| ClearFOVOverride() | Return to automatic FOV |
| PlayCameraShake(Class, Scale) | Play an Unreal CameraShake on top |
| ResetCamera() | Reset all springs. Call on respawn. |
Lean
| Function | What it does |
|---|---|
| LeanLeft(0-1) | Drive lean left. Call each tick. |
| LeanRight(0-1) | Drive lean right. Call each tick. |
| SetLeanInput(-1 to +1) | Combined lean axis |
| StopLean() | Return to center lean |
System toggles (15 functions)
Every subsystem is togglable at runtime. Springs reset cleanly when disabled.
SetHeadBobEnabled | SetBreathingEnabled | SetMicroMovementEnabled
SetLagEnabled | SetTiltEnabled | SetDynamicFOVEnabled | SetInertiaEnabled
SetAccelerationEnabled | SetProceduralShakeEnabled | SetBodycamEnabled
SetChaosEnabled | SetHeartbeatEnabled | SetGlitchEnabled
SetPostProcessEnabled | SetLeanEnabledAll 27 Blueprint events
These are BlueprintImplementableEvent functions. Override them in your Character Blueprint Event Graph to trigger sound, VFX, UI or gameplay logic. They fire automatically.
How to use any event: open your Character Event Graph, right-click, search the event name (for example OnCameraRecoil) and select it. A red event node appears with output pins. Connect it to your logic, such as Play Sound or Spawn Emitter.
Impact and movement
| Event | When it fires | Parameters |
|---|---|---|
| OnCameraImpact | Any significant impact | float Intensity |
| OnCameraShake | Procedural shake active | float Intensity |
| OnCameraLand | Landing from fall | float ImpactStrength |
| OnCameraLanded | Landing (legacy) | (none) |
| OnCameraJumped | Character jumps | (none) |
| OnCameraMove | Player moving above threshold | float Speed |
| OnCameraIdle | Player still for delay | (none) |
| OnFootstep | Each footstep | bool bIsLeftFoot |
Shooter
| Event | When it fires | Parameters |
|---|---|---|
| OnCameraRecoil | Weapon recoil applied | float Intensity |
| OnFireReaction | Post-recoil barrel drop | float Intensity |
| OnSprintStart | Sprint begins | float EntrySpeed |
| OnSprintEnd | Sprint ends | (none) |
| OnSprintFootstep | Heavy sprint step | bool, float Intensity |
| OnADSEnter | Entered ADS | (none) |
| OnADSExit | Exited ADS | (none) |
Horror
| Event | When it fires | Parameters |
|---|---|---|
| OnCameraGlitch | Any glitch fires | (none) |
| OnGlitch | Glitch with type data | EScarGlitchType |
| OnHeartbeatPulse | Each heartbeat | (none) |
| OnHeartbeat | Heartbeat with BPM | float CurrentBPM |
| OnPanicThreshold | Panic crosses 0.3 / 0.6 / 0.9 | float PanicLevel |
| OnHorrorTrigger | Horror event triggered | Type, float Intensity |
Mode and system
| Event | When it fires | Parameters |
|---|---|---|
| OnCameraModeChanged | Mode switched | bool bIsHorror |
| OnModeBlendComplete | Blend finished | bool bIsHorror |
| OnPresetApplied | Preset changed | EScarEyeCamPreset |
| OnLeanStart | Lean begins | float Direction |
| OnLeanEnd | Lean returns to center | (none) |
| OnLeanBlocked | Lean blocked by wall | (none) |
Blueprint workflow examples
Weapon fire with sound and barrel smoke
- On Fire input, call AddRecoil(3.5, 0.8) on your ScarEyeCam component.
- Override OnCameraRecoil in the Event Graph. Connect it to Play Sound 2D and wire Intensity to Volume Multiplier.
- Override OnFireReaction and spawn an emitter at the weapon muzzle for barrel smoke.
Horror jumpscare from a trigger volume
- In your Level Blueprint, on Overlap Begin, get the player ScarEyeCam component.
- Call TriggerHorrorEvent(Jumpscare, 1.0).
- In your Character Blueprint, override OnHorrorTrigger and branch on Type == Jumpscare.
- On True: play a scare sound and flash a white UMG widget overlay, fading out over 0.2s.
Sprint sounds with foot intensity
- Override OnSprintStart and start a looping heavy-breathing audio component.
- Override OnSprintFootstep, play a heavy boot impact, wire Intensity to Volume, and use bIsLeftFoot to alternate variations.
- Override OnSprintEnd and fade out the breathing loop over 1 second.
Dynamic horror music from panic level
- Override OnPanicThreshold and branch on PanicLevel.
- At 0.3 fade in a tension music layer, at 0.6 add distortion, at 0.9 go to full chase music.
- Override OnCameraIdle and fade all layers back to ambient over 5 seconds.
ADS UI (scope overlay)
- Override OnADSEnter. Set the crosshair widget to Hidden and enable the scope overlay widget.
- Override OnADSExit. Show the crosshair and disable the scope overlay.
Cutscene feel switch
- At cutscene start, call ApplyPreset(Cinematic). The camera becomes heavy and cinematic.
- At cutscene end, call ApplyPreset(Tactical) to return to gameplay feel.
- Override OnPresetApplied to crossfade the audio mix to match the new preset.
All editable properties
You do not need to touch most of these. Presets handle everything. They exist for advanced customisation when you need precise control over specific behaviours.
Main
| Property | Type | Default | Description |
|---|---|---|---|
| bEnableCameraSystem | bool | true | Global on/off |
| bEnableSmoothing | bool | true | Toggle spring smoothing |
Presets and mode
| Property | Type | Default | Description |
|---|---|---|---|
| ActivePreset | enum | Realistic | Camera personality |
| bEnableShooterMode | bool | false | Shooter mode |
| bEnableHorrorMode | bool | false | Horror mode |
| ModeBlendDuration | float | 1.0 | Blend time in seconds |
Pipeline
| Property | Type | Default | Description |
|---|---|---|---|
| GlobalSmoothness | float | 1.0 | Damping multiplier |
| GlobalResponsiveness | float | 1.0 | Stiffness multiplier |
| SoftLimitStrength | float | 0.30 | Rotation limit softness |
| LeanEaseStrength | float | 0.65 | Lean input easing |
Motion and inertia
| Property | Type | Default | Description |
|---|---|---|---|
| GlobalWeight | float | 1.0 | Camera mass feel |
| RotationResponsiveness | float | 1.0 | Rotation speed |
| InertiaStrength | float | 1.0 | Input-to-lag ratio |
Impact
| Property | Type | Default | Description |
|---|---|---|---|
| ImpactIntensity | float | 1.0 | Master impact scale (0-5) |
| ImpactRecoverySpeed | float | 1.0 | Impact settle speed |
| ImpactEventThreshold | float | 0.5 | Min magnitude for event |
| bStepMotionEnabled | bool | true | Footstep head bob |
| LandingImpactIntensity | float | 4.5 | Landing drop strength |
| LandingMaxImpact | float | 12.0 | Max landing clamp |
| JumpImpactIntensity | float | 1.8 | Jump camera kick |
Shooter
| Property | Type | Default | Description |
|---|---|---|---|
| bTiltEnabled | bool | true | Strafe tilt |
| bProceduralShakeEnabled | bool | true | Speed-driven shake |
| bBodycamEnabled | bool | true | Off-center mount |
| bDynamicFOVEnabled | bool | true | Movement FOV |
| RecoilSpringStiffness | float | 280 | Recoil recovery speed |
| IdleFOV / WalkFOV / SprintFOV | float | 90 / 90 / 95 | FOV per state |
| SprintSpeedThreshold | float | 420 | Sprint activation |
ADS
| Property | Type | Default | Description |
|---|---|---|---|
| ADSFOV | float | 65.0 | ADS field of view |
| ADSFOVSpeed | float | 12.0 | FOV transition speed |
| ADSStabilization | float | 0.6 | Sway reduction (0-1) |
Lean
| Property | Type | Default | Description |
|---|---|---|---|
| bLeanEnabled | bool | true | Toggle lean |
| LeanMaxAngle | float | 8.0 | Max roll in degrees |
| LeanMaxOffset | float | 18.0 | Max lateral offset in cm |
| LeanForwardOffset | float | 3.5 | Forward shift in cm |
Horror
| Property | Type | Default | Description |
|---|---|---|---|
| bBreathingEnabled | bool | true | Breathing oscillation |
| bChaosEnabled | bool | true | Random micro-jolts |
| bHeartbeatEnabled | bool | true | Heartbeat pulse |
| bGlitchEnabled | bool | true | Camera glitches |
| bPostProcessEnabled | bool | true | Horror post-process |
| PanicBuildRate | float | 0.12 | Panic build speed |
| PanicDecayRate | float | 0.05 | Panic decay speed |
| MaxVignetteIntensity | float | 0.65 | Max vignette |
| MaxChromaticAberration | float | 3.5 | Max chromatic aberration |
| MinColorSaturation | float | 0.65 | Min saturation |
Events config
| Property | Type | Default | Description |
|---|---|---|---|
| MoveEventSpeedThreshold | float | 50.0 | Min speed for OnCameraMove |
| IdleEventDelay | float | 1.5 | Idle delay in seconds |
Per-mode settings reference
Each mode has its own FScarModeParams struct visible under ScarEyeCam > Shooter / Horror. Values blend smoothly during mode transitions.
| Property | Shooter default | Horror default |
|---|---|---|
| StepVerticalImpulse | 32.0 (strong punch) | 18.0 (soft, heavy) |
| StepSpringStiffness | 140.0 (fast snap-back) | 55.0 (slow, lingering) |
| BreathingIntensityV | 0.15 (minimal) | 0.60 (very visible) |
| InertiaInputScale | 0.09 (responsive) | 0.24 (24% lag) |
| RotationSpringStiffness | 32.0 (tight) | 5.0 (dreamy) |
| HeartbeatBPM | 0.0 (disabled) | 68.0 (resting rate) |
| GlitchChance | 0.0 (none) | 0.12 (12% per check) |
| PostProcessIntensity | 0.0 (clean) | 1.0 (full horror) |
| SprintEntryPitch | 2.2 (strong punch) | 0.8 (weak, panicked) |
| FireDropIntensity | 0.5 (noticeable) | 0.15 (minimal) |
| LeanJitterScale | 0.0 (none) | 0.45 (camera trembles) |
The full FScarModeParams struct contains 40 or more properties covering step motion, breathing, inertia, rotation, tilt, acceleration, shake, bodycam, chaos, focus drift, micro movement, heartbeat, glitch, post-process, lean, sprint and fire reaction.
Read-only state variables
Use Get nodes in Blueprint to read these for UI, animation, AI or gameplay logic. They update every frame.
| Variable | Type | What it tells you |
|---|---|---|
| ActiveMode | enum | Current mode: None, Shooter or Horror |
| ModeBlendAlpha | float | Blend progress (0 = Shooter, 1 = Horror) |
| CurrentLeanOutput | float | -1 = full left, 0 = center, +1 = full right |
| bIsADS | bool | True while aiming down sights |
| CurrentSpeed | float | Horizontal speed in cm/s |
| bIsSprinting | bool | True when above sprint threshold |
| bIsMoving | bool | True when speed is over 10 cm/s |
| bIsInAir | bool | True when falling or jumping |
| CurrentPanicLevel | float | Panic 0-1 (Horror only) |
| CurrentHeartbeatBPM | float | Current BPM (Horror only) |
Tuning cheatsheet
| Symptom | Fix |
|---|---|
| Camera feels too floaty | Increase GlobalResponsiveness (1.3). Decrease GlobalSmoothness (0.7). Decrease InertiaStrength (0.5). |
| Camera feels too stiff | Increase GlobalSmoothness (1.4). Increase GlobalWeight (1.3). Increase InertiaStrength (1.2). |
| Impacts not heavy enough | Increase ImpactIntensity (1.5 to 2.0). Decrease ImpactRecoverySpeed (0.7). |
| Impacts too violent | Decrease ImpactIntensity (0.5). Increase ImpactRecoverySpeed (1.5). |
| Horror not scary enough | Increase PanicBuildRate (0.3). Increase MaxChromaticAberration (6.0). Decrease HorrorSettings.RotationSpringStiffness (3.0). |
| ADS too loose or too tight | Adjust ADSStabilization (0-1). Lower for natural sway, higher for laser-steady. |
Use cases, limitations and performance
Where to use ScarEyeCam
- Bodycam shooters
- Tactical FPS
- Horror exploration
- Walking simulators and narrative adventures
- Story-driven cinematic projects
- Any first-person game that needs physical camera feel
Not designed for
- Static cameras or security camera systems
- RTS, top-down or isometric games
- Projects without a player-controlled first-person camera
Honest positioning. We would rather you know exactly what this does than oversell it.
Performance
ScarEyeCam runs entirely on the game thread with zero allocations per frame. All systems are spring-based math with no traces, no line checks and no collision queries. Subsystems toggled off consume zero CPU. Tested at 120+ FPS on mid-range hardware with all systems active.
Supported platforms
Win64, Mac, Linux, Android and iOS. The plugin uses only core engine APIs, with no platform-specific code, and compiles on all platforms supported by UE 5.2 through 5.7.
Stuck on something?
We answer every serious message ourselves. Discord is the fastest way to get an answer from the person who built the plugin.