public static TInputDevice GetDevice <TInputDevice>() where TInputDevice : InputDevice, new()
        {
            if (s_Instance == null)
            {
                var go = new GameObject("VirtualDeviceManager");
                go.hideFlags = HideFlags.HideInHierarchy;
                s_Instance   = go.AddComponent <VirtualDeviceManager>();
                DontDestroyOnLoad(go);
            }

            return(s_Instance.GetDeviceInternal <TInputDevice>());
        }
        public void OnPointerDown(PointerEventData data)
        {
            Gamepad       gamepad = VirtualDeviceManager.GetDevice <Gamepad>();
            ButtonControl control;

            switch (m_ButtonControl)
            {
            case ButtonOption.Action1: control = gamepad.action1; break;

            case ButtonOption.Action2: control = gamepad.action2; break;

            case ButtonOption.Action3: control = gamepad.action3; break;

            case ButtonOption.Action4: control = gamepad.action4; break;

            default: return;
            }
            VirtualDeviceManager.SendValueToControl(control, 1);
        }
        void UpdateVirtualAxes(Vector3 delta)
        {
            Gamepad gamepad = VirtualDeviceManager.GetDevice <Gamepad>();

            if (m_UseX)
            {
                ButtonControl control;
                control = (m_StickChoice == StickOption.LeftStick ? gamepad.leftStickLeft : gamepad.rightStickLeft);
                VirtualDeviceManager.SendValueToControl(control, Mathf.Max(0, -delta.x));
                control = (m_StickChoice == StickOption.LeftStick ? gamepad.leftStickRight : gamepad.rightStickRight);
                VirtualDeviceManager.SendValueToControl(control, Mathf.Max(0, delta.x));
            }

            if (m_UseY)
            {
                ButtonControl control;
                control = (m_StickChoice == StickOption.LeftStick ? gamepad.leftStickDown : gamepad.rightStickDown);
                VirtualDeviceManager.SendValueToControl(control, Mathf.Max(0, -delta.y));
                control = (m_StickChoice == StickOption.LeftStick ? gamepad.leftStickUp : gamepad.rightStickUp);
                VirtualDeviceManager.SendValueToControl(control, Mathf.Max(0, delta.y));
            }
        }