For the Unity Editor to support OpenVR tracked controllers, the Unity VR subsystem presents VR controller inputs as separate joysticks. Use the UnityEngine.Input class to access the axis and button values.
OpenVR’s Unity integration doesn’t refer to any specific hardware when presenting axis and button states. This page provides the axis and button mappings for the three types of controllers supported by OpenVR: HTC Vive, Oculus Touch, and Valve Knuckles Controllers.
When properly configured and connected, any OpenVR-compatible controllers are internally named as either OpenVR Controller - Left or OpenVR Controller - Right. Access this name through the list returned by UnityEngine.Input.GetJoystickNames(). When available, these controllers appear highlighted in green in the SteamVR status menu when tested with Steam. To access this menu you must have both Steam and SteamVR installed and running on your machine.
You can test the availability of these controllers by periodically checking for their presence in the list of joystick names through script. When the controllers turn off, or when you remove their batteries, an empty string replaces their name in the list returned by UnityEngine.Input.GetJoystickNames(). When the controllers turn on again, their name reappears in the list of returned joysticks.
This section provides diagrams for each type of controller supported by OpenVR devices, along with information on the internal Unity input mapping for each controller button.
The diagram below displays the different inputs available on HTC Vive controllers for use in VR applications.
1 | Menu Button |
---|---|
2 | Trackpad |
3 | System button |
4 | Status light |
5 | Micro-USB port |
6 | Tracking sensor |
7 | Trigger |
8 | Grip button |
The diagram below displays the different inputs available on Oculus Touch controllers for use in VR applications.
The diagram below displays the different inputs available when using Knuckles controllers in VR applications.
The table below lists controller inputs for each OpenVR-supported controller, their interaction types, Unity axis and button IDs, along with the value range for each axis.
HTC Vive Controller | Oculus Touch Controller | Valve Knuckles Controller | Interaction Type | Unity Button ID | Unity Axis ID | Unity Axis Value Range |
---|---|---|---|---|---|---|
Left Controller Menu Button (1) | Button.Three | Left Controller Inner Face Button | Press | 2 | ||
Right Controller Menu Button (1) | Button.One | Right Controller Inner Face Button | Press | 0 | ||
Left Controller Outer Face Button | Press | 3 | ||||
Right Controller Outer Face Button | Press | 1 | ||||
Left Controller Trackpad (2) | Button.PrimaryThumbstick | Left Controller Trackpad | Press | 8 | ||
Right Controller Trackpad (2) | Button.SecondaryThumbstick | Right Controller Trackpad | Press | 9 | ||
Left Controller Trackpad (2) | Button.PrimaryThumbstick | Left Controller Trackpad | Touch | 16 | ||
Right Controller Trackpad (2) | Button.SecondaryThumbstick | Right Controller Trackpad | Touch | 17 | ||
Left Controller Trackpad (2) | Axis2D.PrimaryThumbstick | Left Controller Trackpad | Horizontal Movement | 1 | –1.0 to 1.0 | |
Left Controller Trackpad (2) | Axis2D.PrimaryThumbstick | Left Controller Trackpad | Vertical Movement | 2 | –1.0 to 1.0 | |
Right Controller Trackpad (2) | Axis2D.SecondaryThumbstick | Right Controller Trackpad | Horizontal Movement | 4 | –1.0 to 1.0 | |
Right Controller Trackpad (2) | Axis2D.SecondaryThumbstick | Right Controller Trackpad | Vertical Movement | 5 | –1.0 to 1.0 | |
Left Controller Trigger (7) | Axis1D.PrimaryIndexTrigger | Left Controller Trigger | Touch | 14 | ||
Right Controller Trigger (7) | Axis1D.SecondaryIndexTrigger | Right Controller Trigger | Touch | 15 | ||
Left Controller Trigger (7) | Axis1D.PrimaryIndexTrigger | Left Controller Trigger | Squeeze | 9 | 0.0 to 1.0 | |
Right Controller Trigger (7) | Axis1D.SecondaryIndexTrigger | Right Controller Trigger | Squeeze | 10 | 0.0 to 1.0 | |
Left Controller Grip Button (8) | Axis1D.PrimaryHandTrigger | Left Controller Grip Average | Squeeze | 11 | 0.0 to 1.0 | |
Right Controller Grip Button (8) | Axis1D.SecondaryHandTrigger | Right Controller Grip Average | Squeeze | 12 | 0.0 to 1.0 | |
Left Controller Index Finger Cap Sensor | 20 | 0.0 to 1.0 | ||||
Right Controller Index Finger Cap Sensor | 21 | 0.0 to 1.0 | ||||
Left Controller Middle Finger Cap Sensor | 22 | 0.0 to 1.0 | ||||
Right Controller Middle Finger Cap Sensor | 23 | 0.0 to 1.0 | ||||
Left Controller Ring Finger Cap Sensor | 24 | 0.0 to 1.0 | ||||
Right Controller Ring Finger Cap Sensor | 25 | 0.0 to 1.0 | ||||
Left Controller Pinky Finger Cap Sensor | 26 | 0.0 to 1.0 | ||||
Right Controller Pinky Finger Cap Sensor | 27 | 0.0 to 1.0 |
Note: Any hardware features not listed in the table above are not exposed through the OpenVR API and are therefore not exposed through Unity’s input system.
When developing applications to support OpenVR devices, it is important to note certain differences in input event triggers and response rates for buttons on all three controllers.
Unity Touch Input events differ for each platform controller:
The grip trigger differs between platforms:
The HTC Vive controllers each have two grip buttons but both map to the same axis. The value for these buttons is 0.0 when not pressed and 1.0 when pressed (intermediate values between 0.0 and 1.0 are not possible).
The grip on the Oculus Touch Controller is an analog trigger with a range from 0.0 to 1.0 (intermediate values are possible).
The grip on the Valve Knuckles Controller is a weighted average of the input values for each of the individual finger touch sensors.
Did you find this page useful? Please give it a rating:
Thanks for rating this page!
What kind of problem would you like to report?
Thanks for letting us know! This page has been marked for review based on your feedback.
If you have time, you can provide more information to help us fix the problem faster.
Provide more information
You've told us this page needs code samples. If you'd like to help us further, you could provide a code sample, or tell us about what kind of code sample you'd like to see:
You've told us there are code samples on this page which don't work. If you know how to fix it, or have something better we could use instead, please let us know:
You've told us there is information missing from this page. Please tell us more about what's missing:
You've told us there is incorrect information on this page. If you know what we should change to make it correct, please tell us:
You've told us this page has unclear or confusing information. Please tell us more about what you found unclear or confusing, or let us know how we could make it clearer:
You've told us there is a spelling or grammar error on this page. Please tell us what's wrong:
You've told us this page has a problem. Please tell us more about what's wrong:
Thank you for helping to make the Unity documentation better!
Your feedback has been submitted as a ticket for our documentation team to review.
We are not able to reply to every ticket submitted.