Ensure you use Project Settings ⇒ Player ⇒ Input Handling ⇒ Both, or multiple errors may occur.
The input in NWH Vehicle Physics 2 revolves around InputProvider
s. These scripts obtain user input from different sources such as InputSystem or Rewired (e.g. keypresses, mouse movement, gamepad input, etc.), process it, and pass it on to the vehicles.
Multiple InputProvider
s can coexist, allowing for e.g. MobileVehicleInputProvider
, InputSystemVehicleInputProvider
, and SteeringWheelVehicleInputProvider
to be present simultaneously. Input from all InputProvider
s is combined.
The diagram above illustrates the path from the input source to the vehicle input state:
Auto Set Input
is set to true, the state of the corresponding input for the vehicle in question will be set to the combined value of all inputs.Input > AutoSetInput
set to false, the new input will be discarded. This occurs when the vehicle is inactive or when the input is set by another script (e.g., AI).autoSetInput
is enabled on them.VehicleInputProvider
(for vehicle-related input) or SceneInputProvider
(for scene-related input, such as cameras). Thus, it's best to consider InputProviders as a standardized interface between different input methods and a vehicle.InputProvider
s are divided into VehicleInputProviders and SceneInputProviders. VehicleInputProviders transmit vehicle input (throttle, brakes, etc.), while SceneInputProviders handle scene input (vehicle changing, camera changing, camera movement, and other inputs not directly related to the vehicle). One of each is necessary (e.g., InputSystemVehicleProvider
and InputSystemSceneInputProvider
).InputStates
struct and can be copied from one vehicle to another if needed. For example, this is done when a trailer is connected to a towing vehicle.InputStates
, ensure autoSetInput
is set to false.
Out of the box gamepad bindings are only available for InputSystem.
Name | Type | Keyboard Defaults | Gamepad Defaults | Description |
---|---|---|---|---|
Steering | axis [-1,1] | A/D | Left Stick - Left/Right | Steering. |
Throttle | axis [0,1] | W | Left Stick - Up, Right Trigger | Throttle. |
Brakes | axis [0,1] | S | Left Stick - Down, Left Trigger | Brakes. |
Clutch | axis [0,1] | Manual clutch. 0 for disengaged and 1 for engaged. | ||
Handbrake | axis [0,1] | Space | B (Xbox) / Circle (PS) | |
EngineStartStop | Button | E | ||
ShiftUp | button | R | Right Shoulder | |
ShiftDown | button | F | Left Shoulder | |
ShiftIntoR1 | button | ` | Shift into 1st reverse gear. | |
ShiftIntoN | button | 0 | Shift into neutral. | |
ShiftInto1 | button | 1 | Shift into 1st forward gear. | |
ShiftInto[n] | button | 2,3,4,etc. | Shift into [n]th gear. | |
LowBeamLights | button | L | Y (Xbox) / Triangle (PS) | |
HighBeamLights | button | K | ||
HazardLights | button | J | ||
ExtraLights | button | ; | ||
LeftBlinker | button | Z | ||
RightBlinker | button | X | ||
Horn | button | H | ||
Module Bindings | ||||
FlipOver | button | M | Used for FlipOverModule. | |
Boost | button | Left Shift | A (Xbox) / X (PS) | Used for NOSModule. |
Cruise Control | button | N | Used for CruiseControlModule. | |
TrailerAttachDetach | button | T | X (Xbox) / Square (PS) | Used for Trailer and TrailerHitch modules. |
Name | Type | Keyboard Defaults | Gamepad Defaults | Description |
---|---|---|---|---|
ChangeCamera | button | C | Start | Changes camera. |
CameraRotation | 2D axis | Mouse Delta | Right Stick | Controls camera rotation. |
CameraPanning | 2D axis | Mouse Delta | Right Stick | Controls camera panning. |
CameraRotationModifier | button | Mouse - LMB | Right Stick Press | Enables camera rotation. |
CameraPanningModifier | button | Mouse - RMB | Left Stick Press | Enables camera panning. |
CameraZoom | axis | Mouse - Scroll | D-Pad Up/Down | Camera zoom in/out. |
ChangeVehicle | button | V | Select | Change vehicle or enter/exit vehicle. |
FPSMovement | 2D axis | WASD | Left Stick | Demo FPS controller movement. |
ToggleGUI | button | Tab | Toggles demo scene GUI. |
InputProvider
for handling user input on desktop devices through keyboard and mouse or gamepad.
Since v1.1 InputSystem package is required even if not used. If using the old/classic Unity input set Project Settings ⇒ Player ⇒ Input Handling to Both
and proceed as normal. InputSystem package being present installed will not interfere with old/classic Unity input / InputManager.
When first importing NWH Vehicle Physics 2 the project will be missing required bindings. There are two ways to add those:
[UnityProjectPath]/ProjectSettings/InputManager.asset
file. To do so:To set up InputManager-based input in the scene add the following components to the scene:
Any vehicle that is present in the scene will now receive input from these providers.
When using DS4Windows, InputSystem will detect button presses twice.
Active Input Handling select
Input System Package (New)
or Both
- the latter in case your project still uses UnityEngine.Input
somewhere.InputSystemVehicleInputProvider
and InputSystemSceneInputProvider
to any object in your scene..inputactions
files. Save Asset
must be clicked for the changes to take effect.Since v1.7.1 NWH Vehicle Physics 2 also supports Rewired input.
Rewired Input Manager
to the scene. It already contains the Rewired InputManager
, as well as the RewiredVehicleInputProvider
and RewiredSceneInputProvider
needed for NVP2 control.InputSystemVehicleInputProvider
, InputManagerVehicleInputProvider
, InputSystemSceneInputProvider
and InputManagerSceneInputProvider
scripts from the scene to prevent input duplication. All these can technically be present at the same time but there are no benefits to it and duplicate inputs might happen.MobileVehicleInputProvider
and MobileSceneInputProvider
to the scene.UnityEngine.UI.Button
component and replace it with MobileInputButton
. MobileInputButton
inherits from UnityEngine.UI.Button
and adds hasBeenClicked
and isPressed
fields which are required for Mobile Input Provider
MobileVehicleInputProvider
and MobileSceneInputProvider
inspectors. Empty fields will be ignored.For more info visit SteeringWheelInputProvider page.
Since v1.0 multiple InputProvider
s can be present in the scene, meaning that their input has to be combined to get the final input result. To get the combined input use:
float throttle = InputProvider.CombinedInput(i => i.Throttle()); bool engineStartStop = InputProvider.CombinedInput(i => i.EngineStartStop());
Or to get the input from individual InputProvider
s (say to find out if a button was pressed on a keyboard):
float throttle = InputProvider.Instances[0].Throttle;
Input in each vehicle is stored in InputStates
struct:
myVehicleController.input.states
In case input should not be retrieved from user but from another script - as is the case when AI is used - autoSetInput
should be set to false
. This will disable automatic input fetching from the active InputProvider
.
Input now can be set from any script:
myVehicleController.input.Horizontal = myFloatValue; // Using getter/setter.
myVehicleController.input.states.horizontal = myFloatValue; // Directly accessing states.
When using input generated by code (i.e. AI) it is usually handy to have access to a single axis throttle/brake. This can be done like so:
vehicleController.input.autoSetInput = false; // Tells the vehicle to stop retrieving input values automatically. vehicleController.input.Vertical = 0.5f; //Sets throttle to 0.5f, resets brakes. vehicleController.input.Vertical = -0.5f; //Sets brakes to 0.5f, resets throttle.
vehicleController.input.states.throttle
is equal to vehicleController.input.Throttle
. The latter is just a getter/setter for convenience.
The alternative to this is using the inputModifyCallback
. It is executed just after the input is retrieved by the vehicle and allows modifying the inputs without having to worry about them being overwritten before the end of the frame:
myVehicleController.input.inputModifyCallback.AddListener(MyInputModificationFunction); --- private void MyInputModificationFunction() { vc.input.Handbrake = 1f; // Apply handbrake by overriding the user input. }
If a custom InputProvider
is needed it can easily be written. Custom InputProviders
allow for new input methods or for modifying the existing ones. E.g. if the MobileInputProvider
does not fit the needs of the project a copy of it can be made and modifications done on that copy. That way it will not get overwritten when the asset is updated.
ExampleVehicleInputProvider
and make it inherit from VehicleInputProvider
class:public class ExampleVehicleInputProvider : VehicleInputProvider{}
GetThrottle()
.ToggleGUI()
which are optional and will be ignored if not implemented.false
, 0
or -999
in case of ShiftInto()
method.ExampleVehicleInputProvider
now can be added anywhere in the scene as the included InputSystemVehicleInputProvider
or InputManagerVehicleInputProvider
would be.
Example custom input script is below. Note that to reference NWH.Common.Input the script will either need to be generated inside Scripts > Input folder of the asset or referenced inside the project .asmdef file if the script is placed outside of the VehiclePhysics directory. For more info about assembly definitions check out the Import guide.
using NWH.Common.Input; using UnityEngine; using UnityEngine.InputSystem; /// <summary> /// Example class for handling input. /// </summary> public class CustomVehicleInputProvider : VehicleInputProviderBase { public override void Awake() { base.Awake(); // Your initialization code here (if needed). Just a standard MonoBehaviour Awake(). } public void Update() { // Your Update() code here (if needed). Just a standard MonoBehaviour Update(). } public override Throttle() { // Return your custom value here, example: return 0.5f; // Replace this line with e.g. player.GetAxis("Throttle") for Rewired. } public override Steering() { // Return your custom steering value here. return 0.123f; } // ...and so on. Override the functions that you want to use. If you do not need Clutch() for example, // do not override it. }