Capturing usage of the HTC Vive system button

429 Views Asked by At

The system button isn't re-mappable, but is it possible to identify when the user pressed this it, either via the Steam SDK or VRTK Controller Actions? I can see that VRTK at least knows about it?

        public virtual void InitaliseHighlighters()
    {
        highlighterOptions = new Dictionary<string, object>();
        highlighterOptions.Add("resetMainTexture", true);
        VRTK_BaseHighlighter objectHighlighter = VRTK_BaseHighlighter.GetActiveHighlighter(gameObject);

        if (objectHighlighter == null)
        {
            objectHighlighter = gameObject.AddComponent<VRTK_MaterialColorSwapHighlighter>();
        }

        var controllerHand = VRTK_DeviceFinder.GetControllerHand(gameObject);

        objectHighlighter.Initialise(null, highlighterOptions);
        AddHighlighterToElement(GetElementTransform(VRTK_SDK_Bridge.GetControllerElementPath(SDK_BaseController.ControllerElements.ButtonOne, controllerHand)), objectHighlighter, elementHighlighterOverrides.buttonOne);
        AddHighlighterToElement(GetElementTransform(VRTK_SDK_Bridge.GetControllerElementPath(SDK_BaseController.ControllerElements.ButtonTwo, controllerHand)), objectHighlighter, elementHighlighterOverrides.buttonTwo);
        AddHighlighterToElement(GetElementTransform(VRTK_SDK_Bridge.GetControllerElementPath(SDK_BaseController.ControllerElements.Body, controllerHand)), objectHighlighter, elementHighlighterOverrides.body);
        AddHighlighterToElement(GetElementTransform(VRTK_SDK_Bridge.GetControllerElementPath(SDK_BaseController.ControllerElements.GripLeft, controllerHand)), objectHighlighter, elementHighlighterOverrides.gripLeft);
        AddHighlighterToElement(GetElementTransform(VRTK_SDK_Bridge.GetControllerElementPath(SDK_BaseController.ControllerElements.GripRight, controllerHand)), objectHighlighter, elementHighlighterOverrides.gripRight);
        AddHighlighterToElement(GetElementTransform(VRTK_SDK_Bridge.GetControllerElementPath(SDK_BaseController.ControllerElements.StartMenu, controllerHand)), objectHighlighter, elementHighlighterOverrides.startMenu);
        AddHighlighterToElement(GetElementTransform(VRTK_SDK_Bridge.GetControllerElementPath(SDK_BaseController.ControllerElements.SystemMenu, controllerHand)), objectHighlighter, elementHighlighterOverrides.systemMenu);
        AddHighlighterToElement(GetElementTransform(VRTK_SDK_Bridge.GetControllerElementPath(SDK_BaseController.ControllerElements.Touchpad, controllerHand)), objectHighlighter, elementHighlighterOverrides.touchpad);
        AddHighlighterToElement(GetElementTransform(VRTK_SDK_Bridge.GetControllerElementPath(SDK_BaseController.ControllerElements.Trigger, controllerHand)), objectHighlighter, elementHighlighterOverrides.trigger);
    }
2

There are 2 best solutions below

1
On

You can capture it, but you need to set a tick for sending system button to all applications in SteamVR settings.

1
On

With the SteamVR plugin you can do it like this.

[SerializeField] SteamVR_TrackedObject Controller;
SteamVR_Controller.Device device;
void Update(){
    device = SteamVR_Controller.Input ((int)Controller.index);
    if(device.GetPress (SteamVR_Controller.ButtonMask.System))
    {
        //your code
    }

}