The U3D Character Controller
Every experience needs a body for the visitor to be, and a camera for them to see through. The template ships with both, tuned and networked, so you can build your world instead of building a controller. Walking, running, jumping, crouching, flying, teleporting, swimming, climbing, first and third person, gamepad support, VR, and full multiplayer sync are all in place and working before you change a single value.
🎯 Where to find it
The player prefab lives at Assets → U3D → Prefabs → U3D_PlayerController. Select it and everything you'd want to change is on the U3D Player Controller component in the Inspector.
🎬 See it running first
The template includes a demo scene at Assets → U3D → U3D_Demo, and it's live online at Spacedolphin's U3D Gym. Press Play and try everything: walk, run, jump, fly, teleport, crouch, zoom, switch perspective, and the interactivity tools alongside them. Ten minutes there tells you more about what to change than any list of settings.
⚠️ Change the U3D Player Controller component, and leave the rest alone
The other components on the prefab handle networking and animation. They're wired to work together, and editing them is the most common way to break multiplayer in an otherwise healthy project. Everything you actually need is exposed on the U3D Player Controller component and on the avatar fields described below.
Movement
Tuned defaults, adjustable everywhere
The defaults are set to feel good in a general-purpose space. Change what your project needs and leave the rest. Speed and jump height are the two most worth playing with, because they set the whole pace of how your world feels to move through.
Movement through your world's interactive pieces is handled here too. Riding, climbing, and swimming are built into the controller, which is why the Rideable, Climbable, and Swimmable tools work with a single click and no extra wiring on the player side.
Camera and Perspective
Three perspective modes, set in the Inspector: First Person Only, Third Person Only, or Smooth Scroll, which lets players move between them with the mouse wheel during play. Transitions ease the camera between positions at eye level rather than cutting, so switching never feels jarring.
Always-on free look is the default: move the mouse to look around with no button held. If you'd rather have the older hold-a-button style, it's a toggle.
Left-click orbits the camera around your character without turning them. Right-click rotates the character along with the camera.
Both mouse buttons together moves the player forward while steering with the mouse, the classic exploration-game control some players strongly prefer.
In third person you set how far the camera sits behind the character, and it pulls itself closer when a wall gets in the way so the view stays usable in tight interiors. That collision handling is the difference between a camera that works in a real build and one that only works in an open field.
Using Your Own Avatar
Drop in a humanoid model and it works
Open the U3D_PlayerController prefab, find the U3D Avatar Manager component, and drag your character's FBX into the Avatar FBX field. Press Play. The system checks the rig, applies the scale, and connects the animator to the multiplayer animation sync. No state machine to build, no bones to map by hand, no clips to connect.
Where avatars come from
Anything rigged as a Unity humanoid works without modification, which covers most of the places creators actually get characters:
💡 Check the rig before you assign
Select the FBX in the Project window, open the Rig tab in the Inspector, and make sure Animation Type is set to Humanoid. If it says Generic or Legacy, change it and click Apply. The humanoid bone mapping is what lets one set of animations drive any character regardless of proportions, so this is the setting everything else depends on.
Two behaviors are worth knowing because they're easy to mistake for bugs:
- Your avatar hides in first person. It would otherwise fill the screen. Everyone else in a multiplayer session still sees it normally.
- Root motion must stay off. The controller moves the character; the animation only shows the movement. A humanoid imported with root motion enabled will drift away from where the controller thinks it is.
Animation States
Eight animation states are pre-wired, and they change automatically based on what the player is doing. You don't trigger them, and you don't write any code to connect them:
All eight sync across multiplayer automatically. When someone else jumps, swims, or starts climbing, you see it, and it required nothing from you. Pushing, pulling, kicking, and throwing are driven the same way, so objects your visitors interact with get the matching body language for free.
Swapping in Your Own Animations
The clips are yours to replace
The default animations are a starting point, not a fixed identity. If your character should saunter, stomp, or float, open U3DAnimatorController and replace the clip on any state with your own.
Anything humanoid-rigged works: Mixamo, Asset Store packs, or your own animation out of Blender. Import it with the rig set to Humanoid.
Double-click U3DAnimatorController at Assets/U3D/Scripts/Runtime/Avatar/. The Animator window shows all eight states. Click the one you want to change.
Assign your clip to that state's Motion field. The transitions and networking stay exactly as they are, since only the clip changed.
Replacement clips work on any humanoid avatar as long as their import settings have Animation Type set to Humanoid, which covers Mixamo clips, Asset Store animation packs, and your own Blender exports alike.
💡 Give a project its own feel without touching the original
Duplicate U3DAnimatorController, name the copy for your project, swap clips in the duplicate, and assign it to the Animator Controller field on the player prefab's U3D Networked Animator. Your project gets its own movement personality and the shipped controller stays clean, which means template updates never fight your changes.
⚠️ Swap clips, not parameters
The animator's parameter list is written every frame by the controller. Adding your own parameters is fine, but renaming or deleting the existing ones cuts the connection between the controller and the animation, and the avatar stops responding to movement. Changing clips is always safe; changing parameters is not.
This is the layer where a project stops looking like everyone else's. The controller behavior is shared; the movement personality is yours.
Input and Accessibility
The controller is built on Unity's Input System, with keyboard, mouse, and gamepad supported out of the box. Every action key is remappable in the Inspector, so you can suit a project or an audience without touching code, and the Instructions panel reads your actual bindings, meaning a remapped control shows up correctly to players without you editing a sign.
Several details exist specifically to make longer sessions comfortable: sprint and auto-run as toggles rather than held keys, mouse sensitivity calibrated separately for desktop and mobile browsers with optional smoothing, and teleport and flight as alternatives to walking long distances. Worth leaving on even in projects where you don't personally need them.
VR and WebXR
The same URL, entered in a headset
Visitors on a WebXR-capable headset like Meta Quest open your experience from the same link everyone else uses, and the controller switches into VR mode on its own. No separate build, no app store, no sideloading.
What that gives players:
- Arc teleport movement. Arm it with the stick, aim with a visible reticle on the landing surface, release to go.
- Hands that follow their controllers. Real controller positions drive the avatar's arms, so visitors can wave, point, and reach and everyone else sees it.
- Networked head tracking. Other players see where a VR visitor is looking.
- Snap turning, crouch, and flight, all working in VR.
- Shared sessions with desktop visitors. Headset and desktop players occupy the same space together.
The arm tracking works on any humanoid avatar, including stylized rigs with mitten hands, because it solves the elbow and shoulder from the wrist rather than relying on an extra rigging package. Only the wrists travel across the network and each visitor's machine fills in the rest, which is what keeps gestures readable without flooding a busy session with skeleton data.
One more VR-specific behavior you'd otherwise notice and wonder about: the avatar's idle animation is suppressed in VR. Most idles include gentle breathing and weight shifts, and since the camera rides the head bone, that motion would transfer to the visitor's view and make a stationary world drift underneath them. Walking, running, jumping, crouching, and flying all animate as normal.
💡 If the VR view sits wrong on your own avatar
Different humanoid rigs place the head bone in slightly different spots, so a swapped-in avatar can put the camera at neck height or too far back. The fix is the VR Eye Offset field on the U3D Player Controller: Y moves the view up and down, Z moves it forward and back. Adjust it with the headset on, and the quickest way to judge the result is to place a Mirror in your scene, or simply turn around and look at your own avatar. The shipped values are already right for the avatar that comes with the template.
VR support is powered by De-Panther's WebXR Export package. As long as you're using the standard player prefab and a humanoid avatar, none of this needs setting up. It switches on the moment a visitor arrives in a headset.
Inspector Settings
Everything above is exposed on the U3D Player Controller component, organized into expandable sections:
- Basic Movement for speeds and gravity
- Jump Settings for jump height and multi-jump
- Advanced Movement for flight, teleport, sprint, and auto-run
- Perspective Control for first person, third person, or smooth scroll
- Mouse Look for sensitivity and smoothing
- AAA Camera for orbit behavior and third-person distance
- Input Customization for key bindings
The workflow is the pleasant kind: change a value, press Play, feel the difference, adjust again. Nothing here requires a rebuild or a republish to test, so tune it in the editor until it feels right and publish once you're happy.