Character Controller

Configurable movement, camera, avatars, and multiplayer sync, working the moment you press Play

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.

🚶
Walk and Run Speeds
Separate values for walking and running. Lower them for a tight interior where every step should feel deliberate, raise them for a large landscape you don't want people trudging across.
⬆️
Multi-Jump
A base jump height plus an optional list of extra mid-air jumps, each with its own height. Leave the list empty for an ordinary single jump, or fill it for double and triple jumps in a platforming space.
🌍
Gravity
Set per project. The default is Earth-like; reduce it for floaty low-gravity movement, or raise it for jumps that land with weight.
🔄
Crouch
Toggles crouch and adjusts the player's height automatically, so crouching actually fits through low spaces rather than just changing the camera.
✈️
Flight
Full freedom of movement in all directions, toggled with a key. Gravity switches off while flying, and jump and crouch become up and down. Useful for tours of large builds, for reviewing your own scene, and as an accessibility option for players who find terrain hard to navigate.
🚀
Teleportation
Players teleport to where they're looking, at a distance, landing on solid ground because it respects collision. Good in large worlds, and a kinder alternative to long walks.
🔎
Zoom
Hold to zoom in for a closer look. Works in both first and third person, which makes it handy any time your world has detail worth examining.
🏃
Sprint and Auto-Run
Both available as toggles so players aren't holding a key down for minutes at a time. Remappable, and each can be turned off per project.

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.

🎮 How the camera controls work

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:

🎨
Ready Player Me
Generate an avatar, download the FBX, drop it in. The export already arrives as a Unity humanoid.
🕺
Mixamo
Download any character as FBX with skin. Already humanoid, so it works immediately.
🌸
VRoid Studio
VRoid exports as VRM, so convert it to FBX or bring it in with the UniVRM importer, then set the rig to Humanoid.
🛒
Unity Asset Store
Most character packs ship humanoid-rigged. Confirm in the import settings under Rig → Animation Type.
🎭
Your own Blender exports
Export as FBX with the armature, set Animation Type to Humanoid in Unity's import settings, and you're done.
🎮
Other marketplaces
Sketchfab, ArtStation, CGTrader, and similar. If a model isn't humanoid already, Unity's Avatar configuration tool converts most rigs with standard bone names.

💡 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:

🧍
Idle
Standing still. Subtle breathing and weight shifts, so a stationary character doesn't look frozen.
🚶
Walk
Ordinary movement speed, in whatever direction the player is heading.
🏃
Run
Takes over when the player sprints or auto-runs.
⬆️
Jump
Plays on every jump, including the extra ones if you've configured multi-jump.
🔄
Crouch
Holds while crouched, and moves with the player if they walk while crouching.
✈️
Fly
Plays while flight mode is on.
🏊
Swim
Plays inside a Swimmable volume, so entering water reads correctly without any setup on your part.
🧗
Climb
Plays while the player is on a Climbable surface.

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.

1
Get a humanoid clip

Anything humanoid-rigged works: Mixamo, Asset Store packs, or your own animation out of Blender. Import it with the rig set to Humanoid.

2
Open the animator

Double-click U3DAnimatorController at Assets/U3D/Scripts/Runtime/Avatar/. The Animator window shows all eight states. Click the one you want to change.

3
Swap the clip

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.

Ready to Create Something Amazing?

From Unity to Unreality3D.com. Free.


© 2026 Unreality3D LLC. All rights reserved.