Bird
Raised Fist0
Unityframework~20 mins

Root motion in Unity - Practice Problems & Coding Challenges

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Challenge - 5 Problems
🎖️
Root Motion Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
Predict Output
intermediate
2:00remaining
What is the output of this root motion code snippet?

Consider the following Unity C# code inside an Animator's OnAnimatorMove() method. What will be the final position of the GameObject after this frame?

Unity
void OnAnimatorMove() {
    Vector3 rootMotion = animator.deltaPosition;
    rootMotion.y = 0;
    transform.position += rootMotion * 2f;
}
AThe GameObject moves twice the animator's deltaPosition on the XZ plane.
BThe GameObject moves by the animator's deltaPosition including Y axis.
CThe GameObject does not move because rootMotion.y is set to zero.
DThe GameObject moves by half the animator's deltaPosition on the XZ plane.
Attempts:
2 left
💡 Hint

Remember that animator.deltaPosition gives the root motion movement for this frame, and modifying the Y component affects vertical movement.

🧠 Conceptual
intermediate
1:30remaining
Which statement about root motion in Unity is correct?

Choose the correct statement about how root motion works in Unity animations.

ARoot motion is automatically applied even if <code>Animator.applyRootMotion</code> is false.
BRoot motion only affects the rotation of the GameObject, not its position.
CRoot motion applies the movement of the animated root bone directly to the GameObject's transform.
DRoot motion can only be used with Mecanim's legacy animation system.
Attempts:
2 left
💡 Hint

Think about what root motion means in terms of animation and GameObject movement.

🔧 Debug
advanced
2:30remaining
Why does this root motion code cause the GameObject to jitter?

Examine the following code snippet inside OnAnimatorMove(). The GameObject jitters when moving. What is the cause?

Unity
void OnAnimatorMove() {
    transform.position += animator.deltaPosition;
    transform.rotation = animator.rootRotation;
}
AThe rootRotation is not normalized, causing jitter in rotation.
BThe code adds deltaPosition manually but does not set <code>animator.applyRootMotion</code> to false, causing double movement.
CThe code should multiply deltaPosition by Time.deltaTime to smooth movement.
DThe code should use <code>transform.Translate()</code> instead of modifying position directly.
Attempts:
2 left
💡 Hint

Check the applyRootMotion setting and how root motion is applied automatically.

📝 Syntax
advanced
2:00remaining
Which option correctly overrides OnAnimatorMove to apply root motion only on the XZ plane?

Choose the code snippet that correctly overrides OnAnimatorMove() to apply root motion only on the horizontal plane (X and Z), ignoring vertical movement.

A
void OnAnimatorMove() {
    Vector3 motion = animator.deltaPosition;
    motion.y = 0;
    transform.position += motion;
    transform.rotation = animator.rootRotation;
}
B
void OnAnimatorMove() {
    Vector3 motion = animator.deltaPosition;
    transform.position += motion;
    transform.rotation = animator.rootRotation;
}
C
void OnAnimatorMove() {
    Vector3 motion = animator.deltaPosition;
    motion.y = 0;
    transform.Translate(motion);
    transform.rotation = animator.rootRotation;
}
D
void OnAnimatorMove() {
    Vector3 motion = animator.deltaPosition;
    motion.y = 0;
    transform.position = motion;
    transform.rotation = animator.rootRotation;
}
Attempts:
2 left
💡 Hint

Remember that transform.position += motion adds movement, while transform.position = motion sets absolute position.

🚀 Application
expert
3:00remaining
How to synchronize root motion with physics Rigidbody movement?

You want to use root motion to move a character with a Rigidbody component for physics interactions. Which approach correctly applies root motion to the Rigidbody without breaking physics simulation?

ASet <code>rigidbody.position += animator.deltaPosition</code> and <code>rigidbody.rotation = animator.rootRotation</code> directly in <code>Update()</code>.
BApply root motion by setting <code>transform.position</code> and <code>transform.rotation</code> directly, ignoring Rigidbody.
CDisable root motion and move the Rigidbody manually using forces based on animation speed.
DIn <code>OnAnimatorMove()</code>, call <code>rigidbody.MovePosition(rigidbody.position + animator.deltaPosition)</code> and <code>rigidbody.MoveRotation(animator.rootRotation)</code>.
Attempts:
2 left
💡 Hint

Think about how to move Rigidbody objects properly to keep physics stable.

Practice

(1/5)
1. What does enabling applyRootMotion on an Animator component do in Unity?
easy
A. It resets the character's position to the origin every frame.
B. It lets the animation control the character's movement automatically.
C. It makes the character move only by script, ignoring animations.
D. It disables all animations on the character.

Solution

  1. Step 1: Understand the role of applyRootMotion

    Setting applyRootMotion to true allows the animation's movement data to move the character automatically.
  2. Step 2: Compare with other options

    Other options describe disabling animations or ignoring root motion, which is incorrect.
  3. Final Answer:

    It lets the animation control the character's movement automatically. -> Option B
  4. Quick Check:

    applyRootMotion true = animation controls movement [OK]
Hint: Remember: applyRootMotion true means animation moves character [OK]
Common Mistakes:
  • Thinking applyRootMotion disables animations
  • Confusing root motion with scripted movement
  • Assuming it resets position every frame
2. Which of the following is the correct way to enable root motion in a Unity Animator component via script?
easy
A. animator.applyRootMotion = true;
B. animator.rootMotion = true;
C. animator.enableRootMotion(true);
D. animator.setRootMotion(true);

Solution

  1. Step 1: Recall the correct property name

    The Animator component uses the property applyRootMotion to enable root motion.
  2. Step 2: Check syntax correctness

    Only animator.applyRootMotion = true; is valid C# syntax and correct property usage.
  3. Final Answer:

    animator.applyRootMotion = true; -> Option A
  4. Quick Check:

    Correct property = applyRootMotion [OK]
Hint: Use applyRootMotion property exactly as named [OK]
Common Mistakes:
  • Using incorrect property names like rootMotion
  • Trying to call methods instead of setting properties
  • Syntax errors like missing semicolons
3. Given this code snippet in a Unity script attached to a character:
void OnAnimatorMove() {
    Vector3 rootPos = animator.rootPosition;
    rootPos.y = transform.position.y;
    transform.position = rootPos;
}
What is the effect of this code on the character's movement?
medium
A. The character moves only vertically according to the animation.
B. The character moves exactly as the animation's root motion in all directions.
C. The character ignores root motion and stays still.
D. The character moves following the animation's horizontal root motion but keeps its original vertical position.

Solution

  1. Step 1: Analyze the code's position adjustment

    The code sets the character's position to the animation's root position but keeps the original Y (vertical) position.
  2. Step 2: Understand the movement effect

    This means horizontal movement (X and Z) follows animation, but vertical movement stays unchanged.
  3. Final Answer:

    The character moves following the animation's horizontal root motion but keeps its original vertical position. -> Option D
  4. Quick Check:

    Y position unchanged, horizontal moves with root motion [OK]
Hint: Check which axes are changed in root motion code [OK]
Common Mistakes:
  • Assuming full 3D root motion is applied
  • Ignoring the line that keeps Y position fixed
  • Thinking character stays still
4. You wrote this code to apply root motion in Unity:
void OnAnimatorMove() {
    transform.position = animator.rootPosition;
    transform.rotation = animator.rootRotation;
}
But the character does not move as expected. What is the likely problem?
medium
A. The Animator's applyRootMotion property is not enabled.
B. OnAnimatorMove should not be used for root motion.
C. You must call base.OnAnimatorMove() inside the method.
D. The transform cannot be set inside OnAnimatorMove.

Solution

  1. Step 1: Check root motion enabling

    Root motion only works if applyRootMotion is true on the Animator component.
  2. Step 2: Understand OnAnimatorMove usage

    Using OnAnimatorMove to override root motion is valid, but it requires applyRootMotion enabled.
  3. Final Answer:

    The Animator's applyRootMotion property is not enabled. -> Option A
  4. Quick Check:

    applyRootMotion must be true for root motion [OK]
Hint: Always enable applyRootMotion to use root motion overrides [OK]
Common Mistakes:
  • Forgetting to enable applyRootMotion
  • Thinking base.OnAnimatorMove() is required
  • Believing transform can't be set in OnAnimatorMove
5. You want your character to move with root motion but only apply horizontal movement from the animation, while controlling vertical movement via physics (gravity). How should you modify OnAnimatorMove to achieve this?
hard
A. Set transform.position to animator.rootPosition but keep transform.position.y unchanged.
B. Set transform.position to animator.rootPosition and ignore vertical velocity.
C. Set transform.position to animator.rootPosition and add vertical velocity manually.
D. Do not override OnAnimatorMove; use applyRootMotion only.

Solution

  1. Step 1: Understand the goal

    You want horizontal movement from root motion but vertical movement controlled by physics (like gravity velocity).
  2. Step 2: Combine root motion with vertical velocity

    Override OnAnimatorMove to set horizontal position from root motion and add vertical velocity manually to Y position.
  3. Step 3: Choose the correct approach

    Set transform.position to animator.rootPosition and add vertical velocity manually. describes adding vertical velocity manually, which matches the goal.
  4. Final Answer:

    Set transform.position to animator.rootPosition and add vertical velocity manually. -> Option C
  5. Quick Check:

    Combine root motion horizontal + manual vertical velocity [OK]
Hint: Add vertical velocity manually when overriding root motion [OK]
Common Mistakes:
  • Keeping Y position unchanged ignores physics
  • Ignoring vertical velocity causes unnatural movement
  • Not overriding OnAnimatorMove loses control