NWH Wheel Controller 3D
Search Results for

    Show / Hide Table of Contents

    FAQ

    Warning: Before troubleshooting, check that you have the latest asset version in Window > Package Manager.

    Vehicle physics is behaving weirdly (jitter, jumping, etc.).

    • Check the model rotation as per the Fixing Model Rotation guide.
    • Check the model scale. The root object of the vehicle and WheelControllers should have a scale of [1,1,1].
    • Check that the vehicle inertia is adequate. Sometimes when a model that has the wheels far out (e.g. a 1x1x1 cube with wheels 1 meter away from it) the automatically calculated inertia is too low for the suspension stiffness, physics update rate and default friction settings so the vehicle can become unstable. You can fix this by inputting the inertia values manually into the Rigidbody after unticking the automatic inertia calculation. Typical values are:
      • X (roll): 1000-2500
      • Y (yaw): 3000-5000
      • Z (pitch): 2000-4000
    • Too low physics update rate for stiff suspension, friction or low inertia. This can be fixed by lowering the fixed delta time in the project settings. Check the "Why is physics update rate so important?" section below for more info. It is usually better to fix the settings instead of bumping this up due to the performance cost, although the recommended is 100Hz physics (dt = 0.01).

    Vehicle is not reacting to the input.

    • If using the included CarController, confirm that the Wheel Controller Base Sample is imported and the component is enabled on the vehicle's Rigidbody root.
    • In Edit > Project Settings > Player, confirm that Active Input Handling includes the Input System.
    • Check the serialized CarController.wheels list and its Power, Steer, and Handbrake flags. Reset() discovers child wheels once; later hierarchy changes are not continuously rediscovered.
    • Check the bindings in the shipped CarInputActions.inputactions asset.
    • If using a custom controller, verify that you're reading input correctly and applying motor/brake/steer values to the WheelController components.

    Common scene providers do not supply steering, throttle, or handbrake to the standalone CarController. See Input for the boundary between standalone Wheel Controller and Vehicle Physics input.

    How to make the vehicle feel more arcade?

    Wheel Controller 3D defaults to realism / simcade handling and aims for physical accuracy. For games that need arcade behavior:

    • Create a custom FrictionPreset for arcade handling:
      • Lower B (stiffness) parameter to reduce snap oversteer (e.g., B=6-8 instead of 10)
      • This will reduce the tendency of the vehicle to suddenly lose traction
      • Adjust the curve to be more linear with a flatter peak for more forgiving handling
      • Higher D (peak value) if you want more overall grip (e.g., D=1.2-1.5)
      • Assign this preset to WheelController > Active Friction Preset
    • Set the center of mass to be a bit lower than realistic, e.g. a few centimeters above the floor of the vehicle. This will reduce leaning in the corners.
    • Reduce the Rigidbody inertia to make the vehicle change direction more easily and feel more like an RC car. Overdoing it might cause instabilities and jitter.
    • For more details on adjusting friction presets, see the FrictionPreset documentation.

    How to improve mobile performance?

    • Use Project Settings > Time > Fixed Delta Time of 0.02 or 0.033.
    • Use vehicles with low poly meshes for collision and visuals.
    • Use the Sphere cast type in StandardGroundDetection instead of Multicast for faster ground detection (~0.02ms vs ~0.03-0.05ms per wheel).
    • Lower the Target Effective Rate in WheelControllerManager (try 100Hz instead of 200Hz) to reduce the number of physics substeps.
    • Reduce the number of active WheelController components on screen at once.
    • For distant or AI vehicles, consider using simpler physics or disabling wheels entirely.

    Why is physics update rate so important?

    This is because the physics updates in discrete intervals (each X seconds, e.g. 0.02s by default) which means that the vehicle travels certain distance in between the frames, where there is no physics update. At 450 km/h, for example, that is 125 m/s or 2.5 meters traveled between the frames when using Time.fixedDeltaTime of 0.02 (50Hz physics update). In comparison, only a few cm of sideways travel on the tire can result in slip reaching the peak value and going over it, resulting in reduced friction due to the way tires work on hard surfaces in general. So, there are two ways to get around this:

    • Increase the update rate by decreasing the Fixed Delta Time. This can be done through Project Settings > Time > Fixed Delta Time:
      • 0.03 (33Hz) - Lower end mobile devices. Low physics quality.
      • 0.02 (50Hz) - Default. Adequate for <100km/h.
      • 0.01667 (60Hz) - Suitable for most use cases. Average physics quality.
      • 0.01 (100Hz) - PC, high quality.
      • 0.005 (200Hz) - PC simulators.
    • Make the simulation a bit looser so that the tire can have a bit more play before resulting in loss of friction. This can be done by creating a custom FrictionPreset with a lower B (stiffness) parameter (e.g. 6-8 instead of 10).

    Note: WheelController uses internal substepping (via WheelControllerManager) to run wheel physics at higher rates than Unity's fixed timestep. The Target Effective Rate setting allows wheel physics to run at 200Hz even when Unity's physics runs at 50Hz, improving stability without the full cost of increasing the global physics rate.

    How do I handle different surfaces (asphalt, gravel, ice)?

    Create multiple FrictionPreset assets with different BCDE parameters for each surface type, then switch the activeFrictionPreset on wheels when they contact different surfaces:

    Partial example (assumes assigned wheels and gravelPreset fields):

    void OnTriggerEnter(Collider other)
    {
        if (other.CompareTag("Gravel"))
        {
            foreach (WheelController wheel in wheels)
                wheel.activeFrictionPreset = gravelPreset;
        }
    }
    

    See the FrictionPreset documentation for typical parameter values for different surfaces.

    Why does my vehicle slide when parked on a slope?

    The static friction system should prevent this. Check:

    • Ensure Static Friction Strength is greater than 0 in the StandardFriction component
    • Increase Static Longitudinal Stiffness for steeper slopes
    • Make sure the vehicle has come to a complete stop (the static friction engages below the speed threshold)

    See the FrictionPreset documentation for more details on the static friction system.

    How do I integrate force feedback for steering wheels?

    WheelController exposes aligningMoment on each wheel. Sum the aligning moments from the front (steering) wheels and use that for steering resistance. Use frictionSlip for vibration effects when tires are sliding.

    See the Force Feedback section in WheelController documentation for code examples.

    In this article
    Back to top Copyright © NWH - Vehicle Physics, Aerodynamics, Dynamic Water Physics