Use the Horse Animset Pro generic integration when a visible Ultimate Character Controller rider should mount a Malbers horse, give Horse Animset Pro ownership of movement and mounted animation, then return to normal Ultimate Character Controller control after dismounting.

Compatibility boundary

Horse Animset Pro and its Ultimate Character Controller bridge are maintained and distributed by Malbers Animations. They are not included in the Ultimate Character Controller package or installed through the Ultimate Character Controller Integrations Manager.

Audited evidence What it establishes
Ultimate Character Controller 3.2.0 The Ultimate Character Controller release targeted by this guide.
Installed Horse Animset Pro rider source 4.4.2a The MRider behavior and Inspector workflow described below.
Malbers generic download labeled HAP (4.4.2) UCC (3.0.8) Generic Integration The scene, prefabs, event, and Animator Controller audited for this workflow. Malbers’ integration index describes this route as Ultimate Character Controller 3.08+.
The older Ride HAP.cs bridge and its embedded Ultimate Character Controller 3.0.3 installer A legacy implementation. Do not combine it with the generic bridge or import its old Ultimate Character Controller installer into an Ultimate Character Controller 3.2.0 project.

The generic download does not declare a maximum Ultimate Character Controller version and does not explicitly name Ultimate Character Controller 3.2.0. The 3.08+ label is therefore not a blanket compatibility matrix. Import and validate the bridge in a copy or source-controlled branch of the actual project whenever Ultimate Character Controller, Horse Animset Pro, Cinemachine, or the bridge changes.

Before you begin

  • Install and test Ultimate Character Controller 3.2.0, including its required project layers, before adding the bridge.
  • Install and test Horse Animset Pro by itself. The horse must already move through the Malbers Animal Controller before Ultimate Character Controller is connected.
  • Use a Humanoid Ultimate Character Controller rider with a visible third-person model, Animator, root Rigidbody, and main character collider. The official generic integration also requires the Ultimate Character Controller character to have a ragdoll.
  • If the supplied Mount Camera and Cinemachine prefabs will be used, install the Cinemachine dependency required by the installed Horse Animset Pro release before importing the bridge. The generic package does not pin a Cinemachine version.
  • Make project-owned copies of any Animator Controller or prefab that will be edited.

Install the generic bridge

  1. Download the package from Malbers’ Ultimate Character Controller 3.0.8 generic integration page. Choose the download whose label matches the installed Horse Animset Pro generation; do not substitute the similarly named legacy Ultimate Character Controller 3.0.3 integration.
  2. Import in this order: Ultimate Character Controller 3.2.0, Horse Animset Pro, the required camera dependency, then the generic integration package. Allow Unity to compile after each product.
  3. If an older integration is already present under Assets/Malbers Animations/Horse AnimSet Pro/Integrations/Ultimate Character Controller, inventory its scenes, prefabs, and RideHAP references before importing. A Unity package import does not delete obsolete assets. Keep one configured runtime route, and remove legacy components or source only after confirming that no project prefab or scene still references them.
  4. Do not import UltimateCharacterController3.0.3.unitypackage or UltimateCharacterController2.4.9.unitypackage if either appears inside an older Horse Animset Pro installation. Keep the project’s installed Ultimate Character Controller 3.2.0 package.
  5. After import, inspect the supplied HAP + Ultimate Character Controller new scene, Horse UCC prefab, Opsive Camera prefab, Mount Camera prefab, Opsive Mount event, and Demo HAP Animator Controller. Resolve missing scripts and the first Console error before copying anything into a production scene.

The generic package is asset-based: it supplies a reference scene, prefabs, an event asset, and an Animator Controller. It does not add a RideHAP ability or another Ultimate Character Controller ride script.

Configure the Ultimate Character Controller rider

  1. Open Tools > Opsive > Ultimate Character Controller > Character Manager and build or update the playable Humanoid character with Animator and Ragdoll enabled. If the character already has a complete ragdoll, verify it instead of building a second one.
  2. Confirm that the character walks, turns, animates, and uses its camera before adding Horse Animset Pro.
  3. Add MRider to the same GameObject as the rider’s Animator and root Rigidbody. The generic reference scene keeps Ultimate Character Controller’s character components on this object as well; if the production hierarchy differs, compare every reference with the reference scene instead of relying on automatic lookup.
  4. In MRider, keep Parent to Mount enabled as in the generic scene. Assign Animator, Rigid Body, Rider’s Root, Main Collider, and the Horse Animset Pro Collider Modifier profile. The Main Collider must be the non-trigger collider that enters a horse’s Mount Trigger.
  5. Enable Disable Components and populate Disable List explicitly. The audited generic scene disables these six Ultimate Character Controller roles while mounted:
    • Ultimate Character Locomotion Handler
    • Ultimate Character Locomotion; the pinned reference scene may display its serialized migration component as Legacy Character Locomotion
    • Character IK
    • Character Foot Effects
    • Perspective Monitor
    • the active Opsive player-input implementation
  6. For Ultimate Character Controller 3.2.0, use Player Input Proxy > Player Input to identify the concrete input behavior for the last entry, such as Unity Input, Unity Input System, or Rewired Input. Do not retain a missing reference copied from the Ultimate Character Controller 3.0.8 scene.
  7. Do not leave Disable List empty. In the audited MRider source, an empty list disables every other Behaviour on the MRider GameObject while mounting, which can turn off unrelated Ultimate Character Controller systems.
  8. Do not add Ultimate Character Controller’s native Ride ability or the legacy RideHAP ability. The generic bridge uses MRider directly. The required Ultimate Character Controller Ragdoll ability is a separate prerequisite and remains in the character’s normal ability list.

Add the mounted Animator layer

  1. Duplicate the rider’s working Animator Controller and assign the copy to the Animator.
  2. Select the MRider component. If the controller has no Mounted layer, select Add Mounted Layer.
  3. Confirm that one Mounted layer was added and that the Horse Animset Pro parameters were merged into the controller. The button loads the Layers/Mount v2 controller from Horse Animset Pro and edits the assigned controller in place.
  4. Use the imported Demo HAP controller to validate the reference scene, not as an automatic replacement for a production controller with custom Ultimate Character Controller item and ability animation.

If Add Mounted Layer is not shown, MRider must be able to find an Animator on the same GameObject, and that Animator must use an editable Animator Controller. An Animator Override Controller or an unassigned runtime controller cannot receive the layer through this button.

Configure the horse and cameras

  1. Start with the imported Horse UCC prefab, or compare an existing Horse Animset Pro horse against it.
  2. On a custom horse, verify the Malbers Animal (MAnimal) and Mount components. Assign Mount > Mount Point to the transform that anchors the seated rider.
  3. Keep at least one child Mount Trigger with a trigger collider. Assign its parent Mount reference, mount-side ID, dismount-side ID, and whether that location may be used to dismount. MRider can mount only after its Main Collider enters one of these triggers.
  4. Test the horse’s own walk, turn, stop, and input without a rider. Horse movement remains owned by Horse Animset Pro after the rider mounts.
  5. For the supplied camera handoff, keep one Opsive Mount event asset. In the generic scene, MRider > On Start Mounting invokes it with true, and On End Dismounting invokes it with false.
  6. Use the imported Opsive Camera listener to deactivate the Ultimate Character Controller camera while mounted and restore it after dismount. Use Mount Camera to activate and target the horse camera, or replace both listeners with an equivalent project-owned handoff. Do not leave both camera pipelines active.

The provided Mount Camera contains references to Malbers’ Cinemachine camera prefabs. A missing Cinemachine script must be resolved with the dependency that matches the installed HAP release, or the supplied camera handoff must be replaced; it is not a reason to downgrade Ultimate Character Controller.

Configure mount and horse input

Use Horse Animset Pro MInput

  1. Open the MRider component menu and select Create Mount Inputs. The command adds MInput when it is absent.
  2. Inspect the three generated rows:
    • Mount uses a button-down input and calls MRider.MountAnimal(). The audited source creates it on F, disables it when mounting starts, and enables it when dismounting ends.
    • Dismount calls MRider.DismountAnimal() after a 0.2 second long press. It starts inactive, enables when mounting ends, and disables when dismounting starts.
    • Call Mount uses a button-down input and calls MRider.CallAnimalToggle().
  3. Remap these prototype keys and activation rules for the project. Ensure one press cannot unintentionally run both Mount and Call Mount.
  4. Configure the Horse Animset Pro input that drives MAnimal while riding. Ultimate Character Controller movement actions do not automatically drive the horse.

Use project-owned input

Bind the project’s input events to MRider.MountAnimal() and MRider.DismountAnimal() instead of creating an Ultimate Character Controller ride ability. For Unity Input System or another action-map workflow, keep separate on-foot and riding ownership: disable the gameplay map when mounting finishes, enable the horse’s riding map, then reverse that handoff after dismounting. The generic package’s Malbers MInput rows do not automatically edit an Ultimate Character Controller action asset or switch Ultimate Character Controller action maps.

Whichever route is chosen, only one system should read movement at a time. Ultimate Character Controller owns on-foot movement; Horse Animset Pro owns mounted movement.

Editor checkpoint

Before entering Play Mode, verify all of the following:

  • The Console is clear, and the generic integration scene contains no missing scripts or missing serialized references after Ultimate Character Controller migration.
  • MRider, Animator, Rigid Body, Rider’s Root, Main Collider, and Collider Modifier references are assigned.
  • The rider controller contains exactly one Mounted layer and the parameters added by Horse Animset Pro.
  • Disable Components is enabled and Disable List contains six valid project components, including the Ultimate Character Controller 3.2.0 input implementation rather than a stale Ultimate Character Controller 3.0.8 reference.
  • The Ultimate Character Controller ability list contains Ragdoll but contains neither RideHAP nor native Ride for this workflow.
  • The horse has Animal, Mount, a Mount Point, and at least one enabled Mount Trigger.
  • One mount input path and one horse movement input path are active.
  • The Opsive Mount event has one deliberate Ultimate Character Controller-camera listener and one deliberate mounted-camera listener, or the project has an equivalent camera handoff.

How it runs

When the rider’s Main Collider enters a Mount Trigger, Horse Animset Pro assigns that Mount and allows MountAnimal() to start. At the start of mounting, MRider disables the rider colliders, parents Rider’s Root to the horse’s Mount Point when Parent to Mount is enabled, disables every Behaviour in the explicit Disable List, and sends On Start Mounting. The generic event handoff disables the Ultimate Character Controller camera and enables the mount camera.

At the end of mounting, MRider marks the rider as on the horse, synchronizes rider Animator values from the Malbers Animal, reconnects the mounted collider, and enables the Dismount input. Horse Animset Pro then owns horse movement and rider alignment; Ultimate Character Controller’s locomotion and input behaviors remain disabled.

Dismounting unparents Rider’s Root at the start of the transition. At the end, MRider restores its Rigidbody settings, main and child colliders, every Behaviour in Disable List, and the Mount input, then sends On End Dismounting. The camera listener returns control to Ultimate Character Controller. A forced interruption that never reaches the end callback needs equivalent project cleanup.

Verify in Play Mode

  1. Start on foot and confirm Ultimate Character Controller movement, look input, abilities, and the Ultimate Character Controller camera work normally.
  2. Approach one Mount Trigger with the rider’s Main Collider. In MRider > Debug, confirm Can Mount becomes enabled and the expected Mount Trigger and current Mount are shown.
  3. Press Mount. During the transition, confirm Is Mounting is enabled, the explicit Ultimate Character Controller Disable List is disabled, the Ultimate Character Controller camera turns off, and the mounted camera turns on.
  4. Wait for the transition to complete. Confirm Mounted, Is on Horse, and Is Riding are enabled, the rider is aligned to Mount Point, and the Animator is in the Mounted layer.
  5. Walk forward and backward, turn, accelerate, and stop with the Horse Animset Pro controls. The horse should move, while on-foot Ultimate Character Controller movement and look input should not move or rotate the rider independently.
  6. Request a dismount from a valid Mount Trigger. With the generated default, hold Dismount for at least 0.2 seconds. Confirm Is Dismounting becomes enabled and the rider unparents at the intended side.
  7. After the transition, confirm the Ultimate Character Controller locomotion and input behaviors, Rigidbody settings, colliders, Ultimate Character Controller camera, and Mount input are restored. Ordinary on-foot movement and abilities should work immediately.
  8. Repeat on both sides of the horse, on a slope, after changing camera perspective, and after rapidly releasing movement before dismount. No second camera or Transform writer should remain active.
  9. Test every supported forced exit, including rider death, horse destruction, scene loading, or a network ownership change. Each path must restore Ultimate Character Controller components, input, colliders, and the local camera exactly once.

Troubleshooting

Symptom Check Fix
Unity reports missing Ultimate Character Controller, Malbers, or camera types after import The bridge may have been imported before its dependencies, legacy RideHAP source may target a different Ultimate Character Controller API, or the supplied camera may reference an absent Cinemachine release Install and compile Ultimate Character Controller 3.2.0, HAP, and the matching camera dependency first. Remove only the unreferenced incompatible legacy route, then reimport the generic package.
The generic scene has missing references after import The downloaded scene is serialized against Ultimate Character Controller 3.0.8 and may contain old component references Open the scene in the backed-up test project, allow Ultimate Character Controller migration to finish, then replace every missing Disable List or camera reference with the Ultimate Character Controller 3.2.0 equivalent before saving a project-owned copy.
Add Mounted Layer is absent MRider may not share a GameObject with Animator, the Animator Controller may be unassigned, or it may be an Animator Override Controller Put MRider with the Animator used by the rider, assign an editable project-owned Animator Controller, and reopen the component.
Mount input does nothing and Can Mount stays disabled The rider’s Main Collider may not be entering an enabled Mount Trigger, or the trigger may not reference the intended Mount Assign MRider’s Main Collider, correct the trigger collider and layers, and assign the Mount before testing the input again.
Mount starts but never reaches Is Riding The Mounted layer, its HAP state behaviors, parameters, or compatible rider clips may be absent Add the layer from MRider to the production controller or compare it with Demo HAP, then restore the required HAP parameters and transitions.
The rider jitters, slides, or separates from the horse Ultimate Character Controller and HAP may both be moving the rider because Disable List is incomplete, or native Ride/RideHAP is also active Restore the six explicit Disable List roles and remove the competing Ride implementation. Let MRider own rider alignment while mounted.
The horse does not respond after mounting The Horse Animset Pro riding input or action map may be inactive even though Ultimate Character Controller input was disabled Enable and map the HAP riding input after mount completion, and confirm MAnimal responds before changing Ultimate Character Controller settings.
The camera disappears or two cameras fight Opsive Mount may be missing a listener, the bool may be inverted incorrectly, or both camera owners may remain active Copy the reference event wiring or implement one project handoff: Ultimate Character Controller camera off and mount camera on at start mount, then the reverse at end dismount.
Dismount input does nothing The generated Dismount row may still be inactive, the long press may be shorter than 0.2 seconds, or no valid dismount trigger may be available Finish the mount transition, hold the configured input, and add or enable a Mount Trigger that permits dismounting.
Ultimate Character Controller remains frozen after dismount On End Dismounting may not have run, or a stale or missing component reference may prevent the intended restoration Confirm the transition reaches MRider’s end state, then restore the explicit Disable List references and add cleanup for every forced-interruption path.
The rider collides with the horse or dismounts in a bad pose Main Collider, Collider Modifier, Mount Point, or trigger-side IDs may not match the rider and horse scale Copy the corresponding references from the working generic scene, then resize and reposition the collider profile, Mount Point, and left/right triggers for the production models.

Integration ownership and APIs

The generic package contains no Ultimate Character Controller Ability implementation. Horse Animset Pro’s MRider owns the transition and rider root while mounted, its Mount and MAnimal components own the horse, and its input owns horse movement. Ultimate Character Controller is paused by disabling selected Behaviors; the Opsive Mount event performs only the sample’s camera handoff.

The primary project integration points are:

  • MRider.MountAnimal() and MRider.DismountAnimal() for explicit mount requests.
  • MRider.CallAnimalToggle() for the optional call-mount input.
  • On Start Mounting, On End Mounting, On Start Dismounting, and On End Dismounting for input, camera, item, UI, and interruption handling.
  • MRider’s runtime state, including Can Mount, Can Dismount, Mounted, Is on Horse, Is Mounting, Is Riding, Is Dismounting, Current Mount, and Mount Trigger, for diagnostics rather than a second movement controller.

The normal end-dismount callback restores the objects MRider owns: its Rigidbody and collider settings and every Behaviour in its Disable List. The listeners created by Create Mount Inputs then re-enable Mount input, and the generic scene’s event listener restores the Ultimate Character Controller camera. The generic package does not define Ultimate Character Controller inventory policy. Use MRider events to unequip, hide, or constrain items before mounting and restore them after a completed or forced dismount.

The package also contains no Ultimate Character Controller Save System adapter. Persist a stable rider identity, mount identity, ownership, and a safe transform deliberately. Restoring the rider already mounted or midway through a transition requires project code; loading into a normal dismounted state is safer unless the complete MRider and horse state is reconstructed.

No network authority or replication layer is supplied. A multiplayer implementation must arbitrate one rider per mount, give one peer authority over rider and horse movement, synchronize mount and dismount transitions, and run camera switching only for the local owner. Do not let two peers, or Ultimate Character Controller and HAP on one peer, write the same rider Transform.

The legacy RideHAP class is a different bridge. It is a manually started and stopped Ultimate Character Controller Ability that listens to MRider events and copies the HAP rider pose into Ultimate Character Controller while disabling Ultimate Character Controller input, gravity, and collision. Those details explain old scenes, but they are not setup instructions for the generic package described on this page.