Rideable turns one Ultimate Character Controller character into a mount for another, such as a four-legged horse controlled by a humanoid rider. It owns the seat pose, dismount-clearance areas, mount input override, and mount-side cleanup; the rider uses the separate Ride ability.

Before you begin

  • Both the rider and mount need Ultimate Character Locomotion and Ultimate Character Locomotion Handler.
  • Build and verify the mount as its own UCC character first, with the intended Movement Type and Animator Controller.
  • The rider needs Ride, compatible mount/dismount animations, and usually Move Towards for a repeatable approach pose.
  • The mount Animator needs a Rideable branch compatible with Ability Index 12 and the rider’s mount, ride, and dismount data values.
  • Rideable disables ordinary gameplay input on the mount during Awake. An unoccupied mount that should patrol or follow an AI needs a separate non-player control workflow.

Configure the mount

  1. Select the mount and open Ultimate Character Locomotion.
  2. Expand Abilities, select +, and add Rideable. Keep Start Type and Stop Type set to Manual and Ability Index Parameter set to 12 when using the supplied Animator setup.
  3. Place Rideable near the bottom of the regular ability list. It is concurrent, so locomotion abilities keep running, while a higher-priority active mount ability can supply the Animator parameters when appropriate.
  4. Create a child Transform at the final rider-root pose on the saddle or seat. Match its position and rotation to the intended seated character and assign it to Ride Location. Do not leave this reference empty; the runtime warns and falls back to the mount root.
  5. Inspect Left Dismount Collider and Right Dismount Collider. Adding Rideable creates Capsule Collider children automatically. If either was removed, select Add Dismount Colliders in the Rideable drawer.
  6. Position and size each dismount collider around the space needed by that side’s root-motion animation. Use a Capsule Collider, Box Collider, or Sphere Collider; Rideable disables the assigned components at startup and uses their shapes only for overlap checks.
  7. Add a Move Towards Location on each usable mounting side. Place and rotate each location so the rider reaches the exact root pose expected by its left or right mount animation.
  8. Add or identify the Collider that the rider’s Ride detector will find. For trigger detection, put it on a layer included by Ride’s Detect Layers and enable Is Trigger.
  9. On the rider, configure Ride with its input, object detection, animation events, item choices, and the same Animator index.

Rideable itself does not accept a mount button. Ride detects the mount and calls the mount-side ability manually after its own start checks pass.

Make the important choices

Seat position and rotation

Ride Location is the rider root’s target, not merely a visual saddle marker. During the riding phase, Ride continually moves and rotates the rider to this Transform while treating the mount as a moving platform. Test turns, slopes, and animation poses; a small position or yaw error remains visible for the entire ride.

The mount is scheduled to update before the rider so the seat target is current when the rider follows it.

Mount and dismount sides

The rider’s local X position when Ride starts selects the left or right mount branch. Move Towards Locations make that choice predictable.

When dismount is requested, Rideable checks the collider on the original mounting side first. If that volume overlaps a solid-object layer, it tries the opposite side. A missing collider counts as blocked, and the rider remains mounted when neither side is both assigned and clear.

The generated clearance objects use Capsule Colliders, but Box and Sphere Colliders are also supported. Mesh Collider and other collider types are not valid clearance shapes for Rideable.

Input, look, and camera behavior

Rideable sends OnEnableGameplayInput(false) on the mount during startup. Once occupied, it enables Override Input on the mount’s Ultimate Character Locomotion Handler. Ride then forwards the rider’s raw horizontal input, forward input, and look vector every update; the mount’s Movement Type determines how those values steer it.

Ride also forces independent look on the rider during the mounted lifecycle, allowing its Movement Type to separate look direction from transform rotation. It clears that override after dismount. Keep the camera attached to and configured for the rider, then verify that the chosen rider and mount Movement Types interpret look input as intended.

Items, abilities, and animation

  • Ride blocks item abilities while mounting or dismounting. Item Equip Verifier can unequip the rider before a transition, restore the item after mounting, and wait for it to unequip before dismounting. Ride also stops Aim when dismount begins.
  • Ride blocks Height Change and the incompatible In Air Melee Use ability; the third-person Item Pullback ability is also blocked when that controller is installed.
  • Speed Change is the one regular ability Ride explicitly mirrors: starting or stopping it on the rider starts or stops the mount’s Speed Change. Add it to both characters and match the relevant speed and animation settings.
  • Other rider abilities are not copied automatically. Configure mount abilities deliberately and verify their priority and Animator behavior rather than duplicating every rider ability.
  • Rideable exposes the same Ability Int Data as the active Ride ability, keeping both Animators on the same mount, ride, or dismount phase. A higher-priority mount ability with its own Animator data can take precedence.

States and occupancy

Rideable has no default State name. Set its inherited State only when the mount needs properties for the entire occupied period. On the rider, Ride activates its Mount Complete State (RideMounted by default) after the mounting transition and clears it when dismount begins.

Only one different Ride instance can occupy a Rideable at a time. A second rider fails the mount check until the first rider completes or force-stops the lifecycle.

How it runs

  1. The rider’s Ride detector finds a Collider whose parent hierarchy contains Ultimate Character Locomotion with an available Rideable ability.
  2. After any Move Towards alignment and item verification, Ride starts. It identifies the mounting side, calls Rideable.Mount(this), treats the mount as a moving platform, aligns to the mount’s up direction, and enables independent look.
  3. Rideable starts manually, orders the mount update before the rider, adjusts the two characters’ ignored colliders, clears old override values, and enables input override on the mount handler.
  4. At the rider’s Mount Event, Ride enters its riding phase and moves the rider to Ride Location. Rideable.OnCharacterMount() updates the mount Animator immediately and adds the rider’s colliders to the mount locomotion collision set so the combined character does not clip through obstacles.
  5. During the ride, movement and look input are forwarded to the mount. Rideable mirrors the rider’s Animator data. The rider remains aligned to Ride Location.
  6. After Mount Complete Event, Ride permits toggle input to request a dismount and activates RideMounted when configured.
  7. A dismount request checks both clearance colliders and waits for any required item unequip. Ride clears the mount input override, restores rider root-motion positioning, removes the rider colliders from the mount, and begins the matching side animation.
  8. At Dismount Event, Rideable stops, clears its rider reference, restores collider and input handling, and both characters update their Animator parameters. Ride clears the moving-platform and independent-look states before normal rider control resumes.

A forced Ride stop also calls the Rideable cleanup path, so stale input and collision overrides should not remain after an interruption.

Verify in Play Mode

  1. Keep both Ultimate Character Locomotion components, both locomotion handlers, and both Animator parameter views visible.
  2. Approach from the left and start Ride. Confirm Rideable becomes active, the mount handler enables Override Input, and the mount updates before the rider without a one-frame seat lag.
  3. At OnAnimatorRideMount, confirm the rider root settles exactly on Ride Location and both Animators report Ability Index 12 with the left-mount data value.
  4. Move and look in every direction. Confirm the mount responds to the rider’s values, the rider stays aligned, and the camera/look behavior remains stable.
  5. Toggle Speed Change. Confirm the matching mount Speed Change starts and stops and that both characters use the intended speed and animation.
  6. Attempt to dismount before the mount-complete point and confirm the request is rejected. After completion, confirm RideMounted is active on the rider.
  7. Dismount with the original side clear. Confirm item unequip completes when required, Aim stops, the correct animation runs, and both Ride and Rideable become inactive at OnAnimatorRideDismount.
  8. Block the original dismount volume and confirm the opposite side is used. Block both sides and confirm the rider remains mounted.
  9. Force-stop Ride during mounting, riding, and dismounting in separate tests. Confirm mount override inputs return to zero, Override Input turns off, and collider relationships are restored each time.

Troubleshooting

Symptom Check Fix
The Console reports that Ride Location is null Ride Location has no assigned Transform. Create and assign a correctly aligned seat Transform instead of relying on the mount-root fallback.
The Console reports that a locomotion handler is required The mount has no Ultimate Character Locomotion Handler. Add the handler to the mount root before entering Play Mode.
The rider detects the mount but cannot start Ride Rideable is missing, disabled, already occupied, or blocked by mount/rider ability priority. Enable one Rideable, finish the existing ride, and inspect both active ability lists.
The mount never responds to the rider Rideable is inactive, the handler is missing, or another system writes the mount input after Ride. Restore the mount handler and give Ride’s override input exclusive control while occupied.
An unoccupied mount no longer responds to player input Rideable disabled gameplay input during Awake. Use an AI or custom non-player controller while unoccupied, or explicitly manage gameplay-input ownership for the project.
The rider floats, clips, or faces the wrong direction Ride Location does not match the rider root and seated animation. Adjust both position and rotation while comparing the settled Play Mode pose.
The rider cannot dismount A side collider is missing, both overlap solid layers, or Mount Complete has not occurred. Restore both supported collider shapes, clear their volumes, and verify the rider’s Mount Complete Event.
Dismount chooses the wrong side The rider began on the unexpected local-X side or that side’s collider is blocked. Correct the Move Towards Locations and inspect both clearance volumes.
The mount and rider use different ride phases Ability Index Parameter or Animator transitions differ, or another mount ability has higher parameter priority. Use index 12 on both, match the data branches, and correct mount ability ordering.
Speed Change affects only one character The other character lacks Speed Change or its configuration differs. Add it to both and match the relevant settings; only its active state is mirrored.
Input remains stuck after an interruption A custom force-stop path bypassed Ride/Rideable cleanup. Stop Ride through Ultimate Character Locomotion and preserve the base AbilityStopped calls in subclasses.

Developer reference

Rideable defaults to Manual start, Manual stop, Ability Index Parameter 12, no State name, and IsConcurrent == true. Ride Location, Left Dismount Collider, and Right Dismount Collider have no runtime field initializers, although the editor drawer creates and assigns the two clearance colliders when Rideable is added.

Its public properties are RideLocation, LeftDismountCollider, RightDismountCollider, Ride, CharacterLocomotion, CharacterLocomotionHandler, and GameObject. The lifecycle methods are CanMount(Ride), virtual Mount(Ride), OnCharacterMount(), CanDismount(ref bool leftDismount), StartDismount(), and virtual Dismounted().

Rideable sends OnEnableGameplayInput(false) during Awake and otherwise participates in the standard OnCharacterAbilityActive event when it starts or stops. The rider’s Ride ability consumes OnAnimatorRideMount, OnAnimatorRideMountComplete, and OnAnimatorRideDismount, sends OnCharacterForceIndependentLook, and listens to OnCharacterAbilityActive to mirror Speed Change.

The clearance query supports Capsule Collider, Box Collider, and Sphere Collider shapes, checks Solid Object Layers, and ignores triggers. Override Mount or Dismounted for custom mount-side behavior, but call the base implementation so the rider reference, input override, Animator update, and collision cleanup remain intact.