JuiceBox – Text Effects


SetParameter("shake", "amp", 2) changes a running effect on every character without ... Author your own ... Write Hello and every letter bobs in turn; write Halt! ...


by Digital Dust Inc


★★★★★ star rating
Price History +

Animate TextMeshPro text one character at a time with simple rich text tags - with per-character events and typewriter reveals built in.

Eighteen effects included

Persistent: <wave> · <bounce> · <shake> · <wiggle> · <slideh> · <swing> · <rot> · <incr> · <fade> · <rainb> · <pend> · <dangle>
Appearances: {fade} · {size} · {offset} · {turn}
Disappearances: {#fadeout} · {#shrink} · {#fall}

Waves, hops, jitters, figure-of-eights, spins, pulses, letter-by-letter fade-ins, rainbow colour cycling, and pendulum swings that hang from the top of each letter. Letters can grow, rise or turn into place as they appear, and fade, shrink or fall away as the text hides. Sizes are measured in ems, so one set of effects looks right on a small UI label and a large world-space sign alike.


One effect, three ways to play it

<tag> runs for as long as the text is on screen. {tag} plays once as each character appears. {#tag} plays as the text hides. Where you write the tag decides which, so you don't need separate assets for each.


Tune it right in the string

a=, s= and d= set amplitude, speed and duration for just the characters a tag covers, and any parameter can be set by name. a*2 doubles whatever the profile says. stagger= sets the ripple between characters, and a negative value runs it backwards. by=word and by=line ripple word by word or line by line. Stack tags freely: <wave><rainb> bobs and cycles colour at once, and effects that move the same thing add together instead of fighting. TextMeshPro's own rich-text tags pass straight through.


A typewriter built in

Have each new text type itself out, retype every time the component is enabled, wait for your script, or just show it. Characters Per Second sets the pace, and a separate Reveal Speed multiplier is ready to become a player's text-speed setting. Typing speed and effect speed are independent, and hidden characters keep animating, so a wave is already in step the moment its letters appear.


  • Script control: StartReveal, RevealTo (follow a voice-over), RevealNext, RevealAll (the player's skip), Hide and Continue.
  • Inline tags: <waitfor=0.5> pauses, <speed=2> changes pace mid-line, <waitinput> holds until the player continues, and <?door> or <?sound=creak> fires an event at that exact point in the text.
  • Events: On Character Visible (raised at most once per frame, so letter blips never stack), On Text Shown, On Text Hidden and On Event, all wired in the Inspector or from code. A skip doesn't fire the events it jumps past, unless you skip with RevealTo to keep them.
  • Default Appearance: gives every character an appearance with no markup at all.
  • Skip Appearances: decides whether a skip cuts the appearances short or lets them play.

Driven by your game

SetParameter("shake", "amp", 2) changes a running effect on every character without restarting it, which is ideal for a shiver that grows as a timer runs down. One handle pauses, resumes, retimes, restarts or stops every effect on a text. Changing the text keeps the effects running on the characters that stayed the same, and setting the text it already shows costs nothing, so it's safe to assign every frame. Code that writes to TextMeshPro directly, such as a localisation system, still works.


Author your own

Every effect is an ordinary JuiceBox sequence in an Animation Profile, and its name is its tag. Build new effects in the Sequence Editor's graph and watch them play across sample text in the profile's preview stage. An effect can drive a character's position, horizontal or vertical offset, rotation, hanging rotation, scale, colour or opacity.


Animate TextMeshPro text one character at a time with simple rich text tags. Write <wave>Hello</wave> and every letter bobs in turn; write <shake>Halt!</shake> and the word trembles. Every effect is a JuiceBox sequence, so you can tune the ones that ship or build your own in the node graph, and a new sequence becomes a new tag automatically.


Tags that stay out of your way


  • A tag is just a sequence name, and case doesn't matter.
  • TextMeshPro's own tags (<b>, <color>, <size> and the rest) pass straight through. Anything that isn't an effect name is left alone.
  • Different tags overlap freely and stack sensibly: offsets and rotations add, scale and opacity multiply, colour replaces. Two effects on the same axis, such as wave and bounce, add through a combiner instead of fighting.
  • Two spans of the same tag share one ripple across the line.
  • Spaces are skipped, so a ripple steps from letter to letter without pausing on the gaps.

Tune it, or build your own: Open the effect profile in the JuiceBox Sequence Editor and every effect plays across a sample text in a preview stage, ripple and all. Adjust amplitude, speed, duration, easing and shake settings. Set the stagger between letters (a negative value runs the ripple backwards), or turn on Prewarm so a wave is fully formed from the first frame. To make a new effect, add a sequence, point it at a character property (offset, rotation, hanging rotation, scale, colour or opacity) and use its name as a tag. Point the preview at your own prefab to author on your own font.


Built for real projects


  • Works on both UI and world-space TextMeshPro text.
  • Set the text from code with one property, or keep writing to TextMeshPro directly: localisation systems and existing scripts keep working, and their tags are picked up automatically.
  • Assigning the text it already shows does nothing, so it is safe to set every frame from a data binding. Effects keep playing instead of restarting.
  • All of a text's running effects come back as one handle: pause, resume, restart, change the timescale or stop every letter at once. Slow motion and replaying a fade when a dialogue box reopens are one line each.
  • Looping effects run until you stop them, or give them a duration and they finish their cycle and settle instead of stopping dead.
  • Writes straight into the text mesh at runtime.This doesn't just allow you to animate text, it uses JuiceBox's animation system to let you customize any animation in the graph editor.