GS_Juice
Game feel and feedback motion system — GS_Motion extension with transform and material tracks for visual feedback effects.
GS_Juice provides motion-based visual feedback effects for game feel. It extends the GS_Motion system with feedback-specific track types — transform animation (position, scale, rotation) and material property animation (opacity, emissive, color). Effects are authored as .feedbackmotion data assets and played by FeedbackEmitter components on entities.
For usage guides and setup examples, see The Basics: GS_Juice.
Contents
Feedback System
The feedback system follows the standard GS_Motion domain extension pattern. FeedbackMotionTrack is the domain base class, with two concrete track types. FeedbackMotionAsset holds the track definitions. FeedbackMotion is the instance wrapper struct that manages the runtime lifecycle. FeedbackEmitter is the component that plays effects.
| Component / Type | Purpose |
|---|
| FeedbackEmitter | Component — plays a feedback motion on its entity or a target entity. |
| FeedbackMotion | Instance wrapper struct — asset reference, proxies, runtime composite. |
| FeedbackMotionAsset | Data asset (.feedbackmotion) — holds vector<FeedbackMotionTrack*>. |
| FeedbackMotionTrack | Domain base track — extends GS_Core::GS_MotionTrack. |
| FeedbackTransformTrack | Concrete track — position (Vector2Gradient), scale (FloatGradient), rotation (FloatGradient). |
| FeedbackMaterialTrack | Concrete track — opacity (FloatGradient), emissive (FloatGradient), color (ColorGradient). |
Feedback API
PostProcessing (Planned)
Planned for post-processing feedback effects (screen distortion, color grading, vignette). Not yet implemented.
System Components
| Component | Purpose |
|---|
| GS_JuiceSystemComponent | Runtime system component for GS_Juice. |
Dependencies
- GS_Core (required — provides GS_Motion base system)
Installation
- Enable the GS_Juice gem in your project configuration.
- Ensure GS_Core is also enabled.
- Create
.feedbackmotion assets in the O3DE Asset Editor. - Add
FeedbackEmitter components to entities that need feedback effects.
See Also
For conceptual overviews and usage guides:
For sub-system references:
For related resources:
Get GS_Juice
GS_Juice — Explore this gem on the product page and add it to your project.
1 - Feedback System
Feedback motion tracks, FeedbackEmitter component, and FeedbackMotionAsset reference.
The Feedback System provides the concrete implementation of GS_Juice’s game feel effects. It includes the FeedbackEmitter component for playback, FeedbackMotionAsset for data storage, and two concrete track types for transform and material animation.
For usage guides and setup examples, see The Basics: GS_Juice.

Contents
FeedbackEmitter
The FeedbackEmitter component plays a Feedback Motion on its entity or on a specified target entity.
Inspector Properties
| Property | Type | Description |
|---|
| FeedbackMotion | FeedbackMotion | The motion instance — holds the asset reference, proxy list, and runtime composite. |
| playOnActivate | bool | When true, the motion plays automatically when the entity activates. |
API Reference
| Method | Parameters | Returns | Description |
|---|
Play | — | void | Plays the feedback motion on the owning entity. |
PlayOnTarget | AZ::EntityId target | void | Plays the feedback motion on a different entity. |
Stop | — | void | Stops the currently playing motion. |
FeedbackMotionAsset
The data asset that defines a feedback effect. Created and edited in the O3DE Asset Editor with the .feedbackmotion extension. Extends GS_Core::GS_MotionAsset → AZ::Data::AssetData. Requires GS_AssetReflectionIncludes.h when reflecting — see Serialization Helpers.
Properties
| Property | Type | Description |
|---|
| m_tracks | vector<FeedbackMotionTrack*> | The tracks in this motion. |
| motionName | AZStd::string | Display name for the motion. |
| loop | bool | Whether the motion loops. |
Methods
| Method | Returns | Description |
|---|
GetTrackInfos | vector<GS_TrackInfo> | Returns track UUID + label pairs for proxy sync. |
CreateRuntimeComposite | GS_MotionComposite* | Creates a deep-copy runtime instance of all tracks. |
To understand how to author Feedback Motions, refer to Feedback: Authoring Feedback Motions
Animates entity transform properties. All fields use gradient types for full curve control.
| Field | Type | What It Animates |
|---|
| Position | Vector2Gradient | XY offset from origin (additive). |
| Scale | FloatGradient | Uniform scale factor over time. |
| Rotation | FloatGradient | Rotation angle over time. |
The track captures the entity’s origin transform on Init() and applies offsets relative to it. Effects are additive — multiple transform tracks on the same entity stack correctly.
FeedbackMaterialTrack
Animates entity material properties via the render component.
| Field | Type | What It Animates |
|---|
| Opacity | FloatGradient | Material opacity. |
| Emissive | FloatGradient | Emissive intensity. |
| Color | ColorGradient | Color tint. |
Adding Custom Tracks
Use the FeedbackMotionTrack ClassWizard template to generate a new world-space track — see GS_Juice Templates. The only manual step after generation is adding a Reflect(context) call in {$Gem}DataAssetSystemComponent.cpp. Once reflected, the new track type is discovered automatically and appears in the asset editor type picker.
Override Init(ownerEntityId) to cache entity context, and Update(easedProgress) to drive the target property via its bus.
void ${Custom}Track::Init(AZ::EntityId ownerEntity)
{
// Always call the base first — it sets m_owner.
GS_Juice::FeedbackMotionTrack::Init(ownerEntity);
// Cache the entity's origin value so the track can apply additive offsets.
// Example:
// AZ::TransformBus::EventResult(m_originPosition, ownerEntity, &AZ::TransformInterface::GetWorldTranslation);
// AZ::TransformBus::EventResult(m_originRotation, ownerEntity, &AZ::TransformInterface::GetWorldRotationQuaternion);
}
void ${Custom}Track::Update(float easedProgress)
{
// Evaluate the gradient at the current eased progress and apply to the entity.
// easedProgress is in [0, 1] and already passed through the track's CurveType.
// Example:
// const AZ::Vector3 offset = valueGradient.Evaluate(easedProgress);
// AZ::TransformBus::Event(m_owner, &AZ::TransformInterface::SetWorldTranslation, m_originPosition + offset);
}
See Also
For conceptual overviews and usage guides:
For component references:
For related resources:
Get GS_Juice
GS_Juice — Explore this gem on the product page and add it to your project.
2 - Third Party Implementations
Integration guides for third-party feedback systems with GS_Juice.
This section will contain integration guides for connecting third-party game feel and feedback tools with the GS_Juice system.
For usage guides and setup examples, see The Basics: GS_Juice.
Get GS_Juice
GS_Juice — Explore this gem on the product page and add it to your project.
3 - Templates
ClassWizard templates for GS_Juice — custom feedback motion tracks for world-space game-feel effects.
All GS_Juice extension types are generated through the ClassWizard CLI. The wizard handles UUID generation and cmake file-list registration automatically.
For usage guides and setup examples, see The Basics: GS_Juice.
python ClassWizard.py \
--template <TemplateName> \
--gem <GemPath> \
--name <SymbolName> \
[--input-var key=value ...]
Contents
Feedback Motion Track
Template: FeedbackMotionTrack
Creates a custom animation track for GS_Juice feedback sequences. A FeedbackMotionTrack child animates a world-space entity property (transform, material, audio, particle, etc.) via O3DE buses over a normalised [0,1] eased progress value. Tracks are referenced from GS_FeedbackSequence data assets.
Generated files:
Include/${GemName}/GS_Feedback/MotionTracks/${Name}Track.hSource/GS_Feedback/MotionTracks/${Name}Track.cpp
CLI:
python ClassWizard.py --template FeedbackMotionTrack --gem <GemPath> --name <Name>
Post-generation — manual registration required:
In GS_JuiceDataAssetSystemComponent.cpp, add:
#include <path/to/${Name}Track.h>
// inside Reflect(context):
${Name}Track::Reflect(context);
Extensibility: Same polymorphic pattern as UiMotionTrack — any number of track types, discovered automatically via EnumerateDerived. World-space tracks differ from UI tracks in that they act on entity buses (TransformBus, material buses, etc.) rather than LyShine element interfaces. Init(ownerEntityId) caches the entity context; Update(easedProgress) drives the property.
See also: Feedback — the full feedback system architecture, built-in track types, and domain extension pattern.
See Also
For the full API, component properties, and C++ extension guide:
For all ClassWizard templates across GS_Play gems:
Get GS_Juice
GS_Juice — Explore this gem on the product page and add it to your project.