This is the multi-page printable view of this section. Click here to print.

Return to the regular view of this page.

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 / TypePurpose
FeedbackEmitterComponent — plays a feedback motion on its entity or a target entity.
FeedbackMotionInstance wrapper struct — asset reference, proxies, runtime composite.
FeedbackMotionAssetData asset (.feedbackmotion) — holds vector<FeedbackMotionTrack*>.
FeedbackMotionTrackDomain base track — extends GS_Core::GS_MotionTrack.
FeedbackTransformTrackConcrete track — position (Vector2Gradient), scale (FloatGradient), rotation (FloatGradient).
FeedbackMaterialTrackConcrete 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

ComponentPurpose
GS_JuiceSystemComponentRuntime system component for GS_Juice.

Dependencies

  • GS_Core (required — provides GS_Motion base system)

Installation

  1. Enable the GS_Juice gem in your project configuration.
  2. Ensure GS_Core is also enabled.
  3. Create .feedbackmotion assets in the O3DE Asset Editor.
  4. 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.

FeedbackEmitter component in the O3DE Inspector

 

Contents


FeedbackEmitter

The FeedbackEmitter component plays a Feedback Motion on its entity or on a specified target entity.

Inspector Properties

PropertyTypeDescription
FeedbackMotionFeedbackMotionThe motion instance — holds the asset reference, proxy list, and runtime composite.
playOnActivateboolWhen true, the motion plays automatically when the entity activates.

API Reference

MethodParametersReturnsDescription
PlayvoidPlays the feedback motion on the owning entity.
PlayOnTargetAZ::EntityId targetvoidPlays the feedback motion on a different entity.
StopvoidStops 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_MotionAssetAZ::Data::AssetData. Requires GS_AssetReflectionIncludes.h when reflecting — see Serialization Helpers.

Properties

PropertyTypeDescription
m_tracksvector<FeedbackMotionTrack*>The tracks in this motion.
motionNameAZStd::stringDisplay name for the motion.
loopboolWhether the motion loops.

Methods

MethodReturnsDescription
GetTrackInfosvector<GS_TrackInfo>Returns track UUID + label pairs for proxy sync.
CreateRuntimeCompositeGS_MotionComposite*Creates a deep-copy runtime instance of all tracks.

To understand how to author Feedback Motions, refer to Feedback: Authoring Feedback Motions


FeedbackTransformTrack

Animates entity transform properties. All fields use gradient types for full curve control.

FieldTypeWhat It Animates
PositionVector2GradientXY offset from origin (additive).
ScaleFloatGradientUniform scale factor over time.
RotationFloatGradientRotation 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.

FieldTypeWhat It Animates
OpacityFloatGradientMaterial opacity.
EmissiveFloatGradientEmissive intensity.
ColorColorGradientColor 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.h
  • Source/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.