Skip to content

PlayerCameraManager and Camera Shake

At a glance

Lives in: Blueprint API / Camera Shakes; target is PlayerCameraManager - Returns: Start Camera Shake returns a camera shake instance reference that can later be stopped; stop nodes return no value - Fails by: no visible shake, returning None, or playing only on the wrong local camera - Official docs: Start Camera Shake, Stop Camera Shake, PlayerCameraManager, and Cameras

The one-minute version

  • A PlayerController owns a PlayerCameraManager. That manager calculates the final camera view for that local player.
  • Start Camera Shake plays a shake on a specific PlayerCameraManager and returns the shake instance if one starts.
  • Camera shake is local presentation. In multiplayer, the server can decide that an explosion happened, but each affected client should play its own local shake.
  • Scale multiplies shake intensity. Play Space decides what coordinate space the shake uses.
  • Stop Camera Shake stops a specific returned instance and invalidates it.
  • Camera shake is not possession, not view target switching, and not a gameplay stun. It changes how the camera feels, not who controls the pawn.

What it actually does

The control chain is:

flowchart LR
    PC[PlayerController] --> PCM[PlayerCameraManager]
    PCM --> View[Final camera view]
    Shake[Camera Shake asset/class] --> PCM
    Target[View target / camera actor / pawn] --> PCM

Start Camera Shake asks the manager to create and run a camera shake pattern:

pseudocode of the engine behavior - not engine source

function PlayerCameraManager.StartCameraShake(ShakeClass, Scale, PlaySpace):
    if ShakeClass is None:
        return None

    ShakeInstance = create shake pattern/instance
    ShakeInstance.Scale = Scale
    ShakeInstance.PlaySpace = PlaySpace
    add ShakeInstance to this manager's active shakes
    return ShakeInstance

function PlayerCameraManager.StopCameraShake(ShakeInstance, Immediately):
    if ShakeInstance is active on this manager:
        stop it
        invalidate the instance reference

The shake modifies the final view this PlayerCameraManager produces. It does not move the pawn, CameraActor, spring arm, or view target actor in the world.

When it fails (and what failure does)

Common causes:

  1. No PlayerCameraManager target. You called the node without a valid local PlayerController/camera manager.
  2. Shake class is None or not configured. Nothing useful can be created.
  3. You ran it on the wrong machine. A server's non-local camera manager is not the remote client's screen. Use an owning-client RPC or local event for client presentation.
  4. Split-screen used the wrong player. Player 0's manager shakes player 0's view, not player 1's.
  5. Scale is too small or the asset is subtle. The call works but the effect is barely visible.
  6. You tried to stop a stale instance. A completed/stopped shake instance can already be invalid.
  7. The camera problem is view target/blend setup. Shake cannot fix looking through the wrong camera.

Failure does not damage the player, stun input, or replicate. It is only a local camera effect. Check the target PlayerController, net mode, local control, and returned instance before changing gameplay logic.

The pattern everyone actually uses

For local weapon fire:

Owning client fires weapon
-> local muzzle flash / sound
-> Get Player Controller
-> Get Player Camera Manager
-> Start Camera Shake(RecoilShake, Scale = 0.4)

For server-authoritative explosion with client presentation:

Server validates explosion
-> applies damage / replicated state
-> for affected owning players, Run on Owning Client: Client_PlayExplosionFeedback

Client_PlayExplosionFeedback
-> local sound/VFX
-> PlayerCameraManager Start Camera Shake(ExplosionShake, Scale by distance)

For a long shake you may stop:

Start low-health shake
-> promote Return Value to LowHealthShake

Health recovers
-> Is Valid LowHealthShake
-> Stop Camera Shake(LowHealthShake, Immediately = false)
-> clear LowHealthShake

The C++ twin, for the curious (our own example code):

void ATrainingPlayerController::ClientPlayImpactShake_Implementation()
{
    if (!PlayerCameraManager || !ImpactShakeClass)
    {
        return;
    }

    ActiveImpactShake =
        PlayerCameraManager->StartCameraShake(ImpactShakeClass, 0.75f);
}

Camera shake is not camera switching

Use camera shake when the player should feel recoil, impact, rumble-like screen motion, low-health instability, or nearby explosions.

Use Set View Target with Blend when the camera should actually look through another actor:

  • death camera,
  • inspection camera,
  • security camera,
  • cutscene shot,
  • return to possessed pawn view.

You can combine them, but keep the responsibilities separate.

Lookalikes - which one do I want?

Node / object Changes / returns Use when
Get Player Camera Manager Local PlayerController's camera manager You need to start shakes/fades/camera presentation on that player.
Start Camera Shake Starts a shake; returns instance or None Recoil, damage, landing, explosion feedback.
Stop Camera Shake Stops a specific returned shake instance You stored the active shake and want that one stopped.
Stop All / Stop All Instances Stops broader groups of shakes Cleanup after death/menu/cutscene or ending a repeated effect.
Set View Target with Blend Changes what actor the player views through Camera cut/blend, death cam, inspection view.
Spring Arm lag Smooths normal follow-camera movement The gameplay camera should feel less stiff over time.
Force feedback / gamepad rumble Controller haptics You want physical gamepad feedback, not camera motion.

Rule of thumb: Camera shake is local view feel. View target is what camera you look through. Possession is what body you control.

Going deeper