Avatar Animation System

Drop in any humanoid character and the controller drives it — eight networked animation states, WebGL ready, multiplayer synced

Avatar Animation System

The U3D template includes a complete avatar system that takes any humanoid character and turns it into a fully animated multiplayer player. Walking, running, jumping, crouching, flying, swimming, and climbing all animate automatically and sync across all players in the session. The system is built on Unity 6 standards and Photon Fusion 2, and works in WebGL and WebXR.

🎯 Quick Access

Avatar setup: U3D_PlayerController prefab → U3DAvatarManager component → Avatar FBX field

Avatar Setup Process

The avatar system is part of the Universal Character Controller. The U3D_PlayerController prefab already has all the components you need — U3DAvatarManager, U3DNetworkedAnimator, and the supporting pieces — wired up and ready. To use a different avatar than the one that ships with the template, you change one field in the Inspector.

👤
Drag and Drop a Humanoid
Assign any humanoid FBX to the Avatar FBX field on U3DAvatarManager. The system handles positioning, scaling, and animator setup for you.
💡 What you do:
Open the U3D_PlayerController prefab, find the U3D Avatar Manager component, drag your character's FBX into the Avatar FBX field. Press Play.
⚙️
Auto-Configured
When you assign an avatar, the system checks the rig is humanoid, applies the scale multiplier, and connects the animator to the networked animation system. No manual wiring required.
💡 What gets handled for you:
Humanoid rig validation, animator component setup, scale adjustment, and connection to the multiplayer animation sync.
👁️
First-Person Hiding
When the local player is in first-person view, the avatar hides so it doesn't obstruct the camera. Other players in the multiplayer session still see the avatar fully.
💡 What this looks like:
You see your own world unblocked while everyone else sees your avatar walking, running, and gesturing normally.

Where Avatars Come From

Anything rigged as a Unity humanoid works without modification. That includes the major avatar creation services and most animation marketplaces.

🎨
Ready Player Me
Generate an avatar on Ready Player Me, download the FBX, and drop it in. The export already comes as a Unity humanoid.
🌸
VRoid Studio
VRoid exports as VRM. Use a VRM-to-FBX converter or the official UniVRM importer to bring it into Unity, then assign as humanoid in the Import Settings.
🕺
Mixamo
Download any character from Mixamo as FBX with skin. Already a humanoid rig — works immediately.
🛒
Unity Asset Store
Most character packs on the Asset Store ship as humanoid-rigged. Confirm in the import settings (Rig tab → Animation Type → Humanoid).
🎭
Your Own Blender Exports
Export from Blender as FBX with the armature, set the Animation Type to Humanoid in Unity's Import Settings, and you're done.
🎮
Other Marketplaces
Sketchfab, ArtStation, CGTrader, and similar — anything with a humanoid rig. If the source isn't already humanoid, Unity's Avatar configuration tool can convert most rigs that have standard bone names.

Two things to check before you assign

Rig type: Select the FBX in the Project window. In the Inspector, open the Rig tab. Animation Type should be set to Humanoid. If it's set to Generic or Legacy, change it to Humanoid and click Apply. The system needs the humanoid bone mapping to drive the animations correctly.

VR eye height (if your audience uses VR): Different humanoid rigs put the head bone in different places, which affects where the VR camera sits relative to the avatar's eyes. After assigning your avatar, test in VR and adjust the VR Eye Offset on U3D Player Controller if the view feels too low or too far back. Details below →

Animation System

One animator, one set of clips, eight states

The avatar's animations are driven by U3DAnimatorController, a Unity AnimatorController asset that ships with the template. It contains the eight movement states and the transitions between them. The clips assigned to each state determine how each movement looks.

How transitions happen

U3DNetworkedAnimator reads the player controller's state every frame on the client with state authority and writes animator parameters (IsMoving, IsCrouching, IsFlying, IsSwimming, IsClimbing, IsJumping, IsGrounded, MoveSpeed, MoveX, MoveY, JumpTrigger). Photon Fusion's NetworkMecanimAnimator then syncs those parameters to all other clients, so everyone sees the same animation state at the same time.

8 Core Animation States

The state machine covers the controller's full set of movement modes with eight distinct animation states. Transitions between them happen automatically based on what the player is doing.

🚶
Idle, Walk, Run
The three states most experiences spend the most time in. The animator transitions between them based on the player's current speed.
💡 Where these show up:
Social spaces, exploration scenes, virtual tours, educational experiences, multiplayer hangouts. Pretty much everything.
🦘
Jump, Crouch, Fly
Triggered automatically when the controller enters those movement modes. Network-synced so other players see them too.
💡 Where these show up:
Platforming, stealth gameplay, magical or zero-gravity environments, sandbox building scenes.
🌊
Swim and Climb
The controller handles swimming and climbing as movement states, and the avatar animates accordingly. The Make Climbable tool wires climbing surfaces; swimming animation is driven by NetworkIsSwimming, which your gameplay code can set.
💡 Where these show up:
Underwater scenes, rock climbing puzzles, ladder traversal, and any vertical or aquatic gameplay.
Idle Animation
Base character state when not moving. Should loop seamlessly and represent the character's default pose and subtle movements.
Looping idle pose with subtle motion
🚶
Walking & Running
Primary movement animations with automatic speed-driven transitions. Walking for standard movement, running for sprint mode and higher speeds.
Speed-reactive transitions between walk and run
⬇️
Crouching
Lower stance animation with movement cancellation logic. Character automatically stands when movement is detected.
Crouch hold, ends when the player moves
🦘
Jumping
Handles jump start, air time, and landing phases. Trigger support for multiplayer jump coordination.
Jump-state animation
✈️
Flying
Super hero animation for flight mode. Supports directional movement while maintaining flight posture.
Flying-state animation
🏊
Swimming
Aquatic movement state ready for water environment integration. Activated through external trigger systems.
In-water movement animation
🧗
Climbing
Vertical movement animation for climbing systems. Integrates with environmental triggers for ladder and wall climbing.
Up-and-down climbing motion
🌐
All Networked
Every state syncs across all clients automatically through Photon Fusion 2. No multiplayer code required.
Fusion 2 NetworkMecanimAnimator

VR Hand and Head Tracking

The avatar moves with the visitor's body

When a visitor enters your experience through WebXR, the avatar system gets two extra inputs from the headset: where the head is looking, and where the hands are. Both are wired up automatically and networked to other players in the session.

🙌
Hand Tracking via IK
Real-life controllers drive the avatar's arms through two-bone inverse kinematics. The wrist position and rotation come from the controller, and the IK solver handles the elbow and shoulder.
💡 Works with any humanoid:
No Animation Rigging package dependency. The IK math runs on the standard Unity humanoid bone hierarchy, so it works on any humanoid avatar — including stylized rigs with mitten hands like the wooden mannequin.
👀
Head Tracking, Networked
The avatar's head bone follows the visitor's headset rotation locally, and the rotation syncs to other players in the session. Look around in real life, and other people see your avatar's head turn.
💡 Combined with hand tracking:
Head rotation, gaze direction, and hand position all read naturally to other players. The full upper body comes through, not just the avatar's base movement.
🌐
Wrist-Only Networking
Only wrist transforms are networked, not every joint of the arm. Each client runs its own IK locally to fill in the elbow and shoulder. Bandwidth stays tight while the visual result reads correctly to everyone.
💡 Why this matters:
Avatars can wave, point, gesture, and reach naturally for other players to see, without flooding the network with full skeleton data.
😌
Idle Calm in VR
When you enter VR, the avatar's idle animation is suppressed so the small breathing and weight-shift motion baked into most idles doesn't transfer to your view through the head bone. Walking, running, jumping, crouching, and flying still animate normally.
💡 What this fixes:
The world stays rock solid when you stand still in VR. No subtle drift or rocking from the avatar breathing underneath the camera.

👁️ Adjusting eye height for custom avatars

VR places the camera at your avatar's eye position based on the head bone. Different humanoid rigs put the head bone in slightly different places, so for some avatars the camera will sit too low (looking at the neck) or too far back. There's one Inspector field to fix this:

U3D_PlayerController prefab → U3D Player Controller component → VR Eye Offset

Y moves the camera up and down. Increase it if the camera sits too low. Z moves the camera forward and back. Increase it to sit further inside the avatar's head, decrease it to sit further back. Adjust with the headset on until the view feels right at eye level — easiest to test by looking at a mirror in your scene, or by turning around to face your own avatar.

The default values work for the avatar that ships with the template. If you swap in a Ready Player Me, VRoid, Mixamo, or custom rig and the view feels off, this is the field to adjust.

What "automatic" actually means here

The hand and head tracking components are part of the U3D_PlayerController prefab. As long as you're using the standard prefab and your avatar is a humanoid rig, no setup is required for VR tracking — it activates the moment a visitor enters your experience through WebXR.

Customizing Animations

The eight states are defined in U3DAnimatorController, the AnimatorController asset at Assets/U3D/Scripts/Runtime/Avatar/U3DAnimatorController.controller. Each state has a clip assigned to it. To change how a movement looks, swap the clip in that state.

Swapping a clip for one state

Open U3DAnimatorController by double-clicking it. The Animator window shows the state machine with all eight states. Click the state whose clip you want to change — say, Walking. In the Inspector, the Motion field shows the current clip. Drag your replacement clip into that field. Save and play.

If your replacement clip's bone names match Unity's humanoid bone mapping, it'll work on any humanoid avatar without modification. Mixamo clips, Asset Store animations, and your own Blender exports all behave this way as long as Animation Type is set to Humanoid in their import settings.

Different look for different scenes

Duplicate U3DAnimatorController, give the copy a project-specific name, swap clips in the duplicate, and assign the duplicate to the U3DNetworkedAnimator's Animator Controller field on the player prefab. Original ships untouched, your project gets its own animation feel.

🛡️ Don't modify the parameters list

The animator parameters (IsMoving, IsCrouching, IsFlying, IsSwimming, IsGrounded, IsClimbing, IsJumping, MoveSpeed, MoveX, MoveY, JumpTrigger) are written by U3DNetworkedAnimator every tick. Renaming or removing them breaks the connection to the player controller's state. Adding new parameters is fine; changing the existing ones is not.

Ready to Create Something Amazing?

From Unity to Unreality3D.com. Free.


© 2026 Unreality3D LLC. All rights reserved.