<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Motion on GS_Play Gameplay Framework</title><link>https://gsplay.genomestudios.ca/categories/motion/</link><description>Recent content in Motion on GS_Play Gameplay Framework</description><generator>Hugo</generator><language>en-us</language><atom:link href="https://gsplay.genomestudios.ca/categories/motion/index.xml" rel="self" type="application/rss+xml"/><item><title>GS_MotionTrack</title><link>https://gsplay.genomestudios.ca/docs/framework/core/systems/gs_motion/motion_track/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://gsplay.genomestudios.ca/docs/framework/core/systems/gs_motion/motion_track/</guid><description>&lt;p&gt;GS_MotionTrack is the abstract base class for all animation tracks in the GS_Motion system. Each track animates one aspect of an entity over a time window within a motion. Domain gems extend this with concrete track types — GS_UI provides 8 LyShine tracks, GS_Juice provides 2 feedback tracks.&lt;/p&gt;
&lt;p&gt;For usage guides and setup examples, see &lt;a href="../../../../../the_basics/core/systems/gs_motion/"&gt;The Basics: GS_Core&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="fields"&gt;Fields&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Field&lt;/th&gt;
 &lt;th&gt;Type&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;m_id&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;AZ::Uuid&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Unique track identifier (auto-generated).&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;m_identifier&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;AZStd::string&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Proxy label — if set, the track appears in the proxy list for entity override targeting.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;curveType&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;CurveType&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Easing curve applied to track progress (from the Curves utility library).&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;startTime&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;float&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Time offset before the track begins playing (seconds).&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;duration&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;float&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Track playback duration (seconds).&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;startVarianceMin&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;float&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Minimum random variance added to start time.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;startVarianceMax&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;float&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Maximum random variance added to start time.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="lifecycle"&gt;Lifecycle&lt;/h2&gt;
&lt;p&gt;Each track goes through a fixed lifecycle managed by the parent GS_Motion:&lt;/p&gt;</description></item><item><title>GS_Motion</title><link>https://gsplay.genomestudios.ca/docs/framework/core/systems/gs_motion/motion_engine/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://gsplay.genomestudios.ca/docs/framework/core/systems/gs_motion/motion_engine/</guid><description>&lt;p&gt;GS_Motion is the playback engine that drives animation tracks. It ticks through all tracks each frame, computes per-track progress windows based on start time and duration, applies easing curves, and calls &lt;code&gt;Update(easedProgress)&lt;/code&gt; on each active track. It handles motion lifecycle from initialization through completion.&lt;/p&gt;
&lt;p&gt;For usage guides and setup examples, see &lt;a href="../../../../../the_basics/core/systems/gs_motion/"&gt;The Basics: GS_Core&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="api"&gt;API Reference&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Method&lt;/th&gt;
 &lt;th&gt;Parameters&lt;/th&gt;
 &lt;th&gt;Returns&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;Play&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;—&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;void&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Begin playback from the start.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;PlayWithCallback&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;AZStd::function&amp;lt;void()&amp;gt; cb&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;void&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Play and invoke callback on completion.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;Stop&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;—&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;void&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Stop playback immediately.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;Initialize&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;AZ::EntityId owner&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;void&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Initialize all tracks with the owner entity.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;Unload&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;—&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;void&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Unload all tracks and clean up.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="fields"&gt;Fields&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Field&lt;/th&gt;
 &lt;th&gt;Type&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;motionName&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;AZStd::string&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Display name for the motion.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;tracks&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;vector&amp;lt;GS_MotionTrack*&amp;gt;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;The tracks in this motion.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;loop&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;bool&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Whether playback loops.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;onComplete&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;function&amp;lt;void()&amp;gt;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Completion callback (set via &lt;code&gt;PlayWithCallback&lt;/code&gt;).&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="how-it-works"&gt;How It Works&lt;/h2&gt;
&lt;p&gt;Each frame during playback:&lt;/p&gt;</description></item><item><title>GS_MotionComposite</title><link>https://gsplay.genomestudios.ca/docs/framework/core/systems/gs_motion/motion_composite/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://gsplay.genomestudios.ca/docs/framework/core/systems/gs_motion/motion_composite/</guid><description>&lt;p&gt;GS_MotionComposite is the runtime instance of a motion, created from a GS_MotionAsset. It deep-copies all tracks so each entity gets independent playback state, and applies proxy overrides to redirect specific tracks to different entities in the hierarchy.&lt;/p&gt;
&lt;p&gt;For usage guides and setup examples, see &lt;a href="../../../../../the_basics/core/systems/gs_motion/"&gt;The Basics: GS_Core&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;GS_MotionComposite extends GS_Motion. When an asset&amp;rsquo;s &lt;code&gt;CreateRuntimeComposite()&lt;/code&gt; is called, all tracks are SC-cloned (serialization-context cloned) into a new composite instance. This ensures each entity playing the same motion has its own independent track state — no shared mutation.&lt;/p&gt;</description></item><item><title>GS_MotionAsset</title><link>https://gsplay.genomestudios.ca/docs/framework/core/systems/gs_motion/motion_asset/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://gsplay.genomestudios.ca/docs/framework/core/systems/gs_motion/motion_asset/</guid><description>&lt;p&gt;GS_MotionAsset is the abstract base class for motion data assets. Domain gems extend this with their own asset type and file extension — GS_UI creates &lt;code&gt;UiAnimationMotionAsset&lt;/code&gt; (&lt;code&gt;.uiam&lt;/code&gt;), GS_Juice creates &lt;code&gt;FeedbackMotionAsset&lt;/code&gt; (&lt;code&gt;.feedbackmotion&lt;/code&gt;). Assets are created and edited in the O3DE Asset Editor.&lt;/p&gt;
&lt;p&gt;Extends &lt;code&gt;AZ::Data::AssetData&lt;/code&gt;. All subclasses require &lt;code&gt;GS_AssetReflectionIncludes.h&lt;/code&gt; in their header — see &lt;a href="../../utilities/serialization_helpers/#asset-reflection-includes"&gt;Serialization Helpers&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For usage guides and setup examples, see &lt;a href="../../../../../the_basics/core/systems/gs_motion/"&gt;The Basics: GS_Core&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="api"&gt;API Reference&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Method&lt;/th&gt;
 &lt;th&gt;Returns&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;GetTrackInfos&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;vector&amp;lt;GS_TrackInfo&amp;gt;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Returns track UUID + label pairs for proxy list synchronization in the editor.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;CreateRuntimeComposite&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;GS_MotionComposite*&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Factory — deep-copies all asset tracks into a new runtime GS_MotionComposite instance.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="track-info"&gt;GS_TrackInfo&lt;/h2&gt;
&lt;p&gt;Lightweight struct used for proxy synchronization between asset tracks and instance proxy lists.&lt;/p&gt;</description></item><item><title>GS_Motion</title><link>https://gsplay.genomestudios.ca/docs/framework/core/systems/gs_motion/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://gsplay.genomestudios.ca/docs/framework/core/systems/gs_motion/</guid><description>&lt;p&gt;GS_Motion is the framework&amp;rsquo;s central track-based animation system. It defines abstract base classes that domain gems extend with concrete track types — GS_UI extends it with 8 UI animation tracks (&lt;code&gt;.uiam&lt;/code&gt; assets), and GS_Juice extends it with 2 feedback tracks (&lt;code&gt;.feedbackmotion&lt;/code&gt; assets). The system handles playback timing, per-track easing, proxy-based entity targeting, and deep-copy runtime instancing from data assets.&lt;/p&gt;
&lt;p&gt;For usage guides and setup examples, see &lt;a href="../../../../the_basics/core/systems/gs_motion/"&gt;The Basics: GS_Core&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;h2 id="contents"&gt;Contents&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#architecture"&gt;Architecture&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#core-classes"&gt;Core Classes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#domain-extensions"&gt;Domain Extensions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#extension-pattern"&gt;Extension Pattern&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#see-also"&gt;See Also&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="architecture"&gt;Architecture&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GS_MotionTrack (abstract base)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── UiMotionTrack (GS_UI domain base)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ ├── UiPositionTrack
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ ├── UiScaleTrack
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ ├── UiRotationTrack
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ ├── UiElementAlphaTrack
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ ├── UiImageAlphaTrack
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ ├── UiImageColorTrack
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ ├── UiTextColorTrack
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ └── UiTextSizeTrack
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └── FeedbackMotionTrack (GS_Juice domain base)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── FeedbackTransformTrack
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └── FeedbackMaterialTrack
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GS_MotionAsset (abstract base)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── UiAnimationMotionAsset (.uiam)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └── FeedbackMotionAsset (.feedbackmotion)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GS_MotionComposite (runtime instance)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └── Created by asset&amp;#39;s CreateRuntimeComposite()
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="core-classes"&gt;Core Classes&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Class&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;th&gt;Page&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;GS_MotionTrack&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Abstract base for all animation tracks — fields, lifecycle, virtual methods, extension guide.&lt;/td&gt;
 &lt;td&gt;&lt;a href="./motion_track/"&gt;MotionTrack&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;GS_Motion&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Playback engine — ticks tracks, computes per-track progress windows, applies easing, manages lifecycle.&lt;/td&gt;
 &lt;td&gt;&lt;a href="./motion_engine/"&gt;Motion Engine&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;GS_MotionComposite&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Runtime deep-copy instance with proxy entity overrides — created from GS_MotionAsset.&lt;/td&gt;
 &lt;td&gt;&lt;a href="./motion_composite/"&gt;MotionComposite&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;GS_MotionAsset&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Abstract base for motion data assets — holds track definitions and creates runtime composites.&lt;/td&gt;
 &lt;td&gt;&lt;a href="./motion_asset/"&gt;MotionAsset&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;GS_MotionProxy&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Serialized struct for track-to-entity redirection — allows designers to target named tracks at different entities.&lt;/td&gt;
 &lt;td&gt;&lt;a href="./motion_proxy/"&gt;MotionProxy&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="domain-extensions"&gt;Domain Extensions&lt;/h2&gt;
&lt;p&gt;GS_Motion is designed to be extended by domain gems. Each domain creates its own track hierarchy, asset type, and file extension.&lt;/p&gt;</description></item><item><title>GS_MotionProxy</title><link>https://gsplay.genomestudios.ca/docs/framework/core/systems/gs_motion/motion_proxy/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://gsplay.genomestudios.ca/docs/framework/core/systems/gs_motion/motion_proxy/</guid><description>&lt;p&gt;GS_MotionProxy is a serialized struct that allows designers to redirect a named track to a different entity in the hierarchy. This enables a single motion asset to animate multiple entities — for example, a UI animation that moves one element while fading another.&lt;/p&gt;
&lt;p&gt;For usage guides and setup examples, see &lt;a href="../../../../../the_basics/core/systems/gs_motion/"&gt;The Basics: GS_Core&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="fields"&gt;Fields&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Field&lt;/th&gt;
 &lt;th&gt;Type&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;m_trackId&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;AZ::Uuid&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;References the track&amp;rsquo;s &lt;code&gt;m_id&lt;/code&gt;. Matched during &lt;code&gt;ApplyProxies()&lt;/code&gt;.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;m_label&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;AZStd::string&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Read-only display label (synced from track info at edit time via &lt;code&gt;GetTrackInfos()&lt;/code&gt;).&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;m_proxyEntity&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;AZ::EntityId&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;The entity this track should target instead of the motion&amp;rsquo;s owner entity.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="how-it-works"&gt;How It Works&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Edit time&lt;/strong&gt;: The proxy list syncs from the asset&amp;rsquo;s track info. Each track with an &lt;code&gt;m_identifier&lt;/code&gt; (non-empty label) appears as a proxy slot in the inspector.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Designer assignment&lt;/strong&gt;: The designer drags an entity reference into the proxy&amp;rsquo;s &lt;code&gt;m_proxyEntity&lt;/code&gt; field.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Runtime&lt;/strong&gt;: When &lt;code&gt;GS_MotionComposite::ApplyProxies()&lt;/code&gt; runs, it matches each proxy&amp;rsquo;s &lt;code&gt;m_trackId&lt;/code&gt; to a track&amp;rsquo;s &lt;code&gt;m_id&lt;/code&gt; and overrides that track&amp;rsquo;s target entity.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Playback&lt;/strong&gt;: The track now animates the proxy entity instead of the motion&amp;rsquo;s owner.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="usage"&gt;Usage&lt;/h2&gt;
&lt;p&gt;Proxies are embedded in instance wrapper structs (e.g., &lt;code&gt;UiAnimationMotion&lt;/code&gt;, &lt;code&gt;FeedbackMotion&lt;/code&gt;) alongside the asset reference. Components serialize the proxy list, and the wrapper handles synchronization with the asset.&lt;/p&gt;</description></item><item><title>Motion System</title><link>https://gsplay.genomestudios.ca/docs/the_basics/core/systems/gs_motion/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://gsplay.genomestudios.ca/docs/the_basics/core/systems/gs_motion/</guid><description>&lt;p&gt;GS_Motion is a track-based animation engine built into GS_Core. It drives timed property changes — position, rotation, scale, color, opacity — through authored data assets rather than hand-coded interpolation scripts. Domain gems extend GS_Motion with their own track types: GS_UI adds 8 LyShine-specific tracks for UI animation, and GS_Juice adds transform and material tracks for game feel feedback.&lt;/p&gt;
&lt;p&gt;For architecture details, the domain extension pattern, and all track types, see the &lt;a href="../../../../framework/core/systems/gs_motion/"&gt;Framework API reference&lt;/a&gt;.&lt;/p&gt;</description></item></channel></rss>