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.