The [SteamVR] API makes the motion controller touchpad input available.
1 Import the SteamVR Plugin
2 Open the `Assets\SteamVR\InteractionSystem\Samples\Scenes\Interactions_Example.unity` scene
3 Attach `StickManipulation.cs` on the SteamVR `Player`.
using UnityEngine; using Valve.VR; using Valve.VR.InteractionSystem; public class StickManipulation : MonoBehaviour { private float _mMoveSpeed = 2.5f; private float _mHorizontalTurnSpeed = 180f; private float _mVerticalTurnSpeed = 2.5f; private bool _mInverted = false; private const float VERTICAL_LIMIT = 60f; private void OnGUI() { Player player = Player.instance; if (!player) { return; } EVRButtonId touchPad = EVRButtonId.k_EButton_SteamVR_Touchpad; if (null != player.leftController) { var touchPadVector = player.leftController.GetAxis(touchPad); GUILayout.Label(string.Format("Left X: {0:F2}, {1:F2}", touchPadVector.x, touchPadVector.y)); } if (null != player.rightController) { var touchPadVector = player.rightController.GetAxis(touchPad); GUILayout.Label(string.Format("Right X: {0:F2}, {1:F2}", touchPadVector.x, touchPadVector.y)); } } float GetAngle(float input) { if (input < 0f) { return -Mathf.LerpAngle(0, VERTICAL_LIMIT, -input); } else if (input > 0f) { return Mathf.LerpAngle(0, VERTICAL_LIMIT, input); } return 0f; } // Update is called once per frame void Update() { Player player = Player.instance; if (!player) { return; } EVRButtonId touchPad = EVRButtonId.k_EButton_SteamVR_Touchpad; if (null != player.leftController) { Quaternion orientation = Camera.main.transform.rotation; var touchPadVector = player.leftController.GetAxis(touchPad); Vector3 moveDirection = orientation * Vector3.forward * touchPadVector.y + orientation * Vector3.right * touchPadVector.x; Vector3 pos = player.transform.position; pos.x += moveDirection.x * _mMoveSpeed * Time.deltaTime; pos.z += moveDirection.z * _mMoveSpeed * Time.deltaTime; player.transform.position = pos; } if (null != player.rightController) { Quaternion orientation = player.transform.rotation; var touchPadVector = player.rightController.GetAxis(touchPad); Vector3 euler = transform.rotation.eulerAngles; float angle; if (_mInverted) { angle = GetAngle(touchPadVector.y); } else { angle = GetAngle(-touchPadVector.y); } euler.x = Mathf.LerpAngle(euler.x, angle, _mVerticalTurnSpeed * Time.deltaTime); euler.y += touchPadVector.x * _mHorizontalTurnSpeed * Time.deltaTime; player.transform.rotation = Quaternion.Euler(euler); } } }