Install Asset
Install via Godot
To maintain one source of truth, Godot Asset Library is just a mirror of the old asset library so you can download directly on Godot via the integrated asset library browser
Quick Information
90 game-feel effects for Godot 4 with a visual graph editor β screen shake, hit-stop, damage numbers, springs, screen shaders & more. Inspired by FEEL. MIT.
Juicee β Game Feel Effects for Godot 4
33 game-feel effects with a visual graph editor. Free, MIT.
# It really is this easy:
Juicee.shake_camera(self, 12.0, 0.3)
Juicee.hit_stop(self, 0.08)
Juicee.flash(my_sprite, Color.RED)
Three ways to use the same effect set:
- Inspector β drop a
JuiceePlayernode, build a sequence in the custom card UI - Visual graph editor β wire effects in the JuiceeGraph bottom panel with Trigger / Split / Loop / Random
- Singleton β one-liner from any script (shown above)
All three workflows persist as the same JuiceeSequence.tres.
Install
- Copy
addons/juicee/into your project'saddons/folder - Project β Project Settings β Plugins β enable Juicee
- (Optional) JuiceeGraph panel appears at the bottom of the editor
Requires Godot 4.2+ and the Forward Plus or Mobile renderer (screen shaders use hint_screen_texture).
Updating
Godot has no built-in addon updater. Click β Update in the JuiceeGraph toolbar β it hits the GitHub releases API, shows the latest release notes, and (on confirmation) downloads + extracts the new archive over addons/juicee/. Restart the editor afterwards.
A note on previewing shader effects
Full-screen shader effects (Blur, Chromatic, Glitch, Vignette, Pixelate, Color Grade) sample Godot's SCREEN_TEXTURE, which in editor preview (Inspector βΆ Preview, JuiceeGraph βΆ Test) is clamped to the editor's preview viewport rectangle β the effect will appear bounded to that smaller area.
Run the project (F5 / F6) to see these effects at their true full-screen extent. All other effect categories (Camera, Object, Time, Audio, Physics, Flow) preview accurately in the editor.
Quick start
Singleton (1 line β fastest)
# From any script, anywhere in your game
Juicee.shake_camera(self, 12.0, 0.3)
Juicee.hit_stop(self, 0.08)
Juicee.flash(my_sprite, Color.RED)
Juicee.burst(my_node2d, 20, Color.YELLOW)
Juicee.slow_mo(self, 0.2, 0.5)
Inspector (designer-friendly)
@onready var juicee: JuiceePlayer = $JuiceePlayer
func _on_hit(): juicee.play()
- Add a
JuiceePlayernode to your scene. - Click it in the scene tree.
- The custom Inspector shows an "+ Add Effect" dropdown with all 33 effects.
- Pick effects, tweak sliders, click βΆ Preview Effect.
- Call
juicee.play()from code.
Visual graph editor
- Open the JuiceeGraph bottom panel.
- Right-click in the canvas β search the categorized popup ("Screen" / "Camera" / "Object" / "Time" / β¦).
- Drop a Trigger node, then effect nodes, wire them up.
- Add Loop / Random / Split to control flow.
- βΆ Test β preview the whole graph, blocks pulse as they fire.
- Save β
.tresgraph; β€ Export Sequence β aJuiceeSequence.tresready forJuiceePlayer.sequence.
What's inside
33 effects in 7 categories:
| Category | Effects |
|---|---|
| Screen | Chromatic, Vignette, Blur, Pixelate, Glitch, Color Grade, Screen Tint, Screen Wipe |
| Camera | Shake (2D / 3D), Zoom, FOV 3D, Camera Follow |
| Object | Flash, Modulate, Bounce, Jiggle Physics, Position (2D / 3D), Rotation (2D / 3D), Trail, Burst, Confetti, Light Flash |
| Time | Hit Stop, Time Scale Ramp, Delay |
| Audio | Sound, Music Duck, Rumble |
| Physics | Impulse (RigidBody2D) |
| Flow | Sequence (nested), Property Tween (universal escape hatch) |
Every effect inherits:
chance: floatβ probability the effect fires when triggereddelay: floatβ pre-delay before applyingintensity_min/max: floatβ random intensity multiplier per playcooldown: floatβ minimum seconds between firesstop()β kills any in-flight tweens + cancels manual-loop effectsis_playing() -> boolβ query active state- Signals:
started,finished,stopped
Concurrent effects
If two effects modify the same property at once (e.g., two JuiceeShakeEffects on the same camera), Juicee's ref-counted JuiceeStateStack ensures the camera returns to its TRUE original value when both finish β not a mid-shake snapshot.
Effect A captures cam.offset = (0,0) # true original
Effect B captures cam.offset = (0,0) # gets same baseline (ref-count = 2)
... both shakes run, blending on cam.offset ...
Effect A ends β refs = 1 (no restore yet)
Effect B ends β refs = 0 β cam.offset = (0,0) restored
You don't have to do anything β it just works.
Runtime params (reactive effects)
Pass a dict to play() so effects can react to gameplay state:
# Camera shake biases AWAY from the hit direction
juicee.play({"hit_direction": (hit_position - global_position).normalized()})
Effects access via _runtime_params.get("key", default).
JuiceeShakeEffect ships with hit_direction support β write your own to read whatever your game wants to pass.
See also
docs/how-to-write-effect.mdβ write a new effect in 30 linesdocs/philosophy.mdβ when to use Inspector vs Graph vs Singleton, and whyaddons/juicee/examples/effects_showcase.tscnβ keyboard-driven demo of every effect (run with F6, press 1β9 / 0 / H / B)
Community
Got a cool effect or preset? Two ways to share:
- Pull Request β if it's broadly useful, ship it in the next release for everyone
- Discussions β for game-specific presets, experimental effects, or just show-and-tell
See CONTRIBUTING.md for both paths.
License
MIT β free for personal and commercial projects.
90 game-feel effects for Godot 4 with a visual graph editor β screen shake, hit-stop, damage numbers, springs, screen shaders & more. Inspired by FEEL. MIT.
Reviews
Quick Information
90 game-feel effects for Godot 4 with a visual graph editor β screen shake, hit-stop, damage numbers, springs, screen shaders & more. Inspired by FEEL. MIT.