tbh the single thing that fixed my camera shake was switching from random offset each frame to sampling perlin noise and incrementing through it over time. random offsets snap toward zero unpredictably because there's no continuity between samples — your brain expects organic motion and gets slot machine output instead.
var noise := FastNoiseLite.new()
var trauma: float = 0.0
var noise_t: float = 0.0
const SHAKE_SPEED = 50.0
const MAX_OFFSET = 20.0
func add_trauma(amount: float) -> void:
trauma = min(trauma + amount, 1.0)
func _process(delta: float) -> void:
trauma = max(trauma - delta * 0.8, 0.0)
noise_t += delta * SHAKE_SPEED
var shake := pow(trauma, 2.0)
$Camera2D.offset = Vector2(
noise.get_noise_2d(noise_t, 0.0) * shake * MAX_OFFSET,
noise.get_noise_2d(noise_t, 100.0) * shake * MAX_OFFSET
)
also: stack trauma, don't replace it. multiple hits in quick succession should compound. once i did both of these things my shake went from 'slightly off' to 'actually feels right' immediately.



