How it works
Juicy Actions has three parts.
- Actions are ScriptableObject assets that each do one job: move a transform, spring a scale, shake the camera, flash a renderer, play a sound, emit particles, wait, or load a scene. You create them from the Create > Juicy Actions menu and tune them in the inspector.
- An ActionExecutor runs an ordered list of actions. It is a serializable field, not a component, so it can live on any MonoBehaviour. Items run one after another; a group runs its items together, races them, time-boxes them or loops them.
- ActionRunner and the Action on Event components hold executors for you and fire them on Start, collisions, triggers, taps, hovers, key presses and other events.
From your own code, firing a sequence takes one line:
public ActionExecutor onHitActions;
public void TakeDamage(float amount)
{
onHitActions.Execute(this); // this component becomes the target
}
Each run uses fresh copies of the actions, so your assets never change at runtime. Fields marked [CanOverride] can be overridden per item in the inspector, or from code with SetFieldOverride just before Execute. One asset can then serve different damage values, colors or destinations.
Actions read time from the executor’s clock: the Juicy Actions clock (which can pause and scale actions without touching Unity’s time), Unity time, or unscaled time for pause menus. They share data through a typed Blackboard, where trigger components also publish what they hit, and draw random numbers from a seedable, deterministic source.
Calling Execute while a sequence is still running restarts it: the executor bumps a run key, in-flight actions stop cleanly, and the list plays again. Turn off CanRestart or set a cooldown when repeated triggers should wait instead.
Writing your own actions
When nothing in the catalog fits, write a small C# class. Inherit from InstantAction for one-frame work, ActionOverTime for effects with a duration and curve, ActionOverTimeWithBaseValues for effects that return to the original value, a SpringAction base for bouncy motion, or ActionWithForceTimeUntilNextAction to hold the sequence until something happens. Override ExecuteInternal() and use Executor.Clock and Executor.Random instead of Unity’s Time and Random, so your action follows pause and time scale and stays deterministic. The Action Validator window (Tools > Juicy Actions > Action Validation) flags common mistakes.
Integrations
Free integration packages connect Juicy Actions to other assets: install Juicy Actions and the other asset, then the integration. With Magic Time, executors on Magic Time objects follow that object’s local time scale automatically. With Projectile Factory, components fire sequences on projectile launch, collision and other events, and actions can launch or redirect projectiles. With Game Modules 4, actions change stats, items and conditions, and Game Modules blackboard events can start sequences. Others cover DOTween, Feel, PlayMaker, Dialogue System for Unity, Game Creator 2, Behavior Designer Pro, Ultimate Character Controller, All in 1 3D-Shader and All in 1 Sprite Shader. The documentation explains what each one adds.