ReadonlytargetThe node the extracted translation or rotation moves. Written under
§42 "animation" authority; needs no relationship to the mixer's
target.
ReadonlytrackPath of the clip track to difference, matched exactly against
AnimationTrackLike.path. The clip must contain exactly
one track with this path, and it must be a vector3 or
quaternion track.
Root motion for one playback (§19, plan decision P7-5) — the MVP tier: translation only.
The designated track is removed from normal per-track binding. Its path is never resolved against the mixer's target, its absolute values never write a bound property, and it needs no property to exist at all:
"rootMotion"is a perfectly good path for a channel that exists only to be differenced. What the mixer does with it instead is add the change in its sampled value across each AnimationMixer.advance totarget.transform.position.The loop-aware delta, derived
Let
S(t)be the track sampled at clip-local timet,dthe clip duration, and let one advance move elapsed time fromatob(a <= b). Inside a single iteration the answer is the plain differenceS(l(b)) − S(l(a)), wherelis the clip-local time of an elapsed time.A wrap is where naive differencing fails:
ljumps fromdback to0, soS(l(b)) − S(l(a))would subtract a whole stride and teleport the node backwards. The honest quantity is the distance travelled along the clip, so the crossing is split at the seam — the motion left in the outgoing iteration plus the motion already made in the incoming one:An advance long enough to swallow whole iterations adds one full stride
S(d) − S(0)for each of them, which generalizes both cases toiterationandlare the mixer's own loop bookkeeping (the same functions that place the pose), so root motion wraps exactly when playback does — and, because the last iteration's end reads asl = drather thanl = 0of an iteration that does not exist, the advance that finishes aloop(n)playback contributes the fulln-th stride.S(l(a)),S(d), andS(0)are all held from the previous advance or frozen at play, so a step costs exactly one new sample and no allocation.What does not accumulate
Authority (§42)
The write lands on MixerRootMotionOptions.target's transform, so that node must be under
"animation"authority — independently of whatever node gates the pose, which is often a different one (the pose animates a skeleton under a root the motion moves). A node that is not warns once (deduplicated bywarnAuthorityConflict) and its deltas are skipped.Channels
A
vector3track extracts translation (transform.position.add). Aquaterniontrack extracts rotation: the relative quaternionconjugate(previous) * sampledis multiplied ontotransform.rotation(local composition, the same space the translation channel adds in). Other adapter kinds are still rejected — there is no defensible delta for a scalar or a colour.