๐Ÿงƒ Juicee

June 27, 2026 ยท View on GitHub

Juicee โ€” game-feel effects for Godot 4

๐Ÿงƒ Juicee

Game-feel effects for Godot 4 โ€” 94 effects, a visual graph editor, a custom inspector, and a one-line API. Free & MIT.

Godot 4.3+ License: MIT Effects: 94

๐ŸŽฌ Demo

Same enemy hit โ€” with and without Juicee. One squashes, flashes, throws a particle burst and a crit number; the other just sits there.

Juicee โ€” before / after on the same enemy hit

JuiceePlayer Inspector
Inspector โ€” build a sequence with sliders
JuiceeGraph editor
Graph editor โ€” wire effects visually
# Drop-in presets โ€” one line, done:
Juicee.preset_hit(enemy)
Juicee.preset_hit_crit(enemy)
Juicee.preset_explosion(self)
Juicee.preset_level_up(self)
Juicee.preset_damage_taken(player)
Juicee.preset_death(player)
Juicee.preset_combo(self)
Juicee.preset_dash(self, direction)
Juicee.preset_pickup(coin_node)
Juicee.preset_boss_intro(self)
Juicee.preset_low_health_pulse(player_sprite)
Juicee.preset_victory(self)

# Or individual effects:
Juicee.shake_camera(self, 12.0, 0.3)
Juicee.damage_number(enemy, 999, true)   # crit!
Juicee.bloom(self, 1.5)                  # WorldEnvironment glow
Juicee.spring(my_button, "scale", Vector2(0.4, 0.4))  # bouncy UI

Three ways to use the same effect set:

  • Inspector โ€” drop a JuiceePlayer node, 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

  1. Copy addons/juicee/ into your project's addons/ folder
  2. Project โ†’ Project Settings โ†’ Plugins โ†’ enable Juicee
  3. (Optional) JuiceeGraph panel appears at the bottom of the editor

Requires Godot 4.3+ (uses the @experimental annotation). Works in all three renderers โ€” Forward+, Mobile, and Compatibility โ€” because the screen effects read the viewport through a BackBufferCopy + hint_screen_texture overlay rather than a renderer-specific buffer.

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, Screen Tint, Screen Wipe) sample Godot's SCREEN_TEXTURE, which in editor preview (Inspector โ–ถ Preview, JuiceeGraph โ–ถ Test) is clamped to the editor's preview viewport rectangle. When testing in-editor you'll see a soft amber outline marking that area, with a label reminding you to run the project for the real thing.

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()
  1. Add a JuiceePlayer node to your scene.
  2. Click it in the scene tree.
  3. The custom Inspector shows an "+ Add Effect" dropdown with all 94 effects.
  4. Pick effects, tweak sliders, click โ–ถ Preview Effect.
  5. Call juicee.play() from code.

Visual graph editor

  1. Open the JuiceeGraph bottom panel.
  2. Right-click in the canvas โ†’ the add-node popup. Browse by collapsible category (Screen / Camera / Object / Time / โ€ฆ) or just type to fuzzy-search across everything (โ†‘โ†“ to move, Enter to drop).
  3. Drop a Trigger node, then effect nodes, wire them up.
  4. Add Loop / Random / Split to control flow.
  5. โ–ถ Test โ€” preview the whole graph, blocks pulse as they fire.
  6. Save โ†’ .tres graph; โค“ Export Sequence โ†’ a JuiceeSequence.tres ready for JuiceePlayer.sequence.

C# / .NET

The full singleton API is callable from C# via the bundled bridge โ€” using JuiceeFX;:

Juicee.ShakeCamera(this, 12f, 0.3f);
Juicee.HitStop(this, 0.08f);
Juicee.Flash(mySprite, Colors.Red);
Juicee.PresetHitCrit(this);

Requires the .NET build of Godot with the plugin enabled. See docs/csharp.md.


What's inside

94 effects in 8 categories + 12 drop-in presets + built-in updater:

CategoryCountEffects
Screen18Chromatic, Vignette, Blur, Pixelate, Glitch, Color Grade, Screen Tint, Screen Wipe, Bloom, Tonemap, Shockwave, Cinematic Bars, Scan Lines, Speed Lines โœจ, Film Grain, Radial Blur, Lens Distortion, Depth of Field
Camera9Shake (2D / 3D), Zoom, FOV 3D, Camera Follow, Directional Shake, Camera Bob, Zoom Pulse, Camera Rotation (Dutch Tilt)
Object36Flash, Modulate, Bounce, Jiggle Physics, Position (2D / 3D), Rotation (2D / 3D), Trail, Burst, Confetti, Light Flash, Spring, Ambient Flash, Strobe Light, Recoil, Outline, Color Cycle, Spin, Wiggle, Sprite Bob, Pop In, Shake Control, Pulse, Shader Parameter, Flicker, Scale To, Particle Control, Light 3D Flash, Material 3D, Fade, Flip, Instantiate, Size Delta, Impact Ring โœจ, Sway โœจ
Text6Damage Number (with crit), Floating Text, Button Punch, Typewriter, Number Count, Text Wobble
Time4Hit Stop, Time Scale Ramp, Delay, Freeze Frame
Audio7Sound, Music Duck, Rumble, Reverb, Pitch Shift, Low-Pass (Muffle) โœจ, Audio Source 3D
Physics2Impulse (RigidBody2D), Add Force (2D / 3D)
Flow12Sequence (nested), Property Tween, Animation Player, Set Active, Chain, Beat Sync, Wait For Input, Emit Signal, Debug Log, Animation Tree, Set Property, Auto Destruct

โœจ = new in 1.2.0

Built-in drop-in presets (one-line API)

Juicee.preset_hit(target)                    # shake + flash
Juicee.preset_hit_crit(target)               # hit_stop + bigger shake + chromatic + flash
Juicee.preset_level_up(target)               # shake + zoom + bounce + confetti + warm tint
Juicee.preset_damage_taken(player)           # hit_stop + shake + red tint + vignette + rumble
Juicee.preset_death(player)                  # slow-mo + blur + pixelate + grayscale + glitch
Juicee.preset_explosion(target)              # hit_stop + burst + shake + chromatic
Juicee.preset_combo(target)                  # 3ร— escalating hit-stops + chromatic + burst ๐Ÿ”ฅ
Juicee.preset_dash(target, direction)        # chromatic + blur + zoom + position kick ๐Ÿ”ฅ
Juicee.preset_pickup(item_node)              # bounce + flash + confetti + floating text ๐Ÿ”ฅ
Juicee.preset_boss_intro(target)             # zoom + vignette + shake + ominous red tint ๐Ÿ”ฅ
Juicee.preset_low_health_pulse(sprite)       # sustained red ambient flash (stoppable) ๐Ÿ”ฅ
Juicee.preset_victory(target)                # confetti + zoom + color cycle + rumble ๐Ÿ”ฅ

No .tres lookup, no graph editing required โ€” these build the sequence inline and play it.

Native Godot integration (no custom shaders for these)

  • Bloom / Tonemap โ€” animate your existing WorldEnvironment post-process settings. Zero performance overhead, works in 2D + 3D.
  • Reverb / Pitch Shift / Low-Pass โ€” temporarily inject AudioEffectReverb / AudioEffectPitchShift / AudioEffectLowPassFilter on any audio bus with smooth ramping. Low-Pass is the muffled-on-hit / underwater / stunned feel โ€” pairs perfectly with Hit Stop.
  • Spring โ€” harmonic oscillator on any Vector2 property. Universal bouncy menus, squash-on-hit, panel-into-view animation.

Curve-based parameters (designer-controlled feel)

Effects can opt into a Curve resource for any tweenable property โ€” designers paint a custom easing shape directly in the Inspector. Punch, overshoot, settle, bounce โ€” all without touching effect code. Falls back to standard set_trans / set_ease if no curve is set.

Every effect inherits:

  • chance: float โ€” probability the effect fires when triggered
  • delay: float โ€” pre-delay before applying
  • intensity_min/max: float โ€” random intensity multiplier per play
  • cooldown: float โ€” minimum seconds between fires
  • stop() โ€” kills any in-flight tweens + cancels manual-loop effects
  • is_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

DocWhat's in it
docs/api-reference.mdFull API for every core class: JuiceeEffect, JuiceeSequence, JuiceePlayer, JuiceeStateStack, JuiceeAccessibility, JuiceeBeatClock, JuiceeGraphPlayer
docs/effects-reference.mdAll 94 effects with every @export parameter documented
docs/singleton-api.mdFull Juicee.* singleton method listing with signatures
docs/csharp.mdUsing the entire Juicee API from C# / .NET projects
docs/procedural-sfx.mdProcedural sound effects (sfxr, experimental) โ€” synthesize retro SFX with zero audio assets
docs/graph-editor.mdGraph editor: nodes, debug test, shortcuts, saving, popup search
docs/architecture.mdInternals: generation tokens, overlay pattern, state stack, shader rules, graph execution, accessibility
docs/how-to-write-effect.mdWrite a new effect in 30 lines โ€” patterns, anti-patterns, contribution guide
docs/philosophy.mdWhen to use Singleton vs Inspector vs Graph, and why

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.