Search Unity

Question Cannot Unpair Virtual Mouse

Discussion in 'Input System' started by Mars91, May 18, 2023.

  1. Mars91

    Mars91

    Joined:
    Mar 6, 2012
    Posts:
    572
    As title says I cannot unpair the virtual mouse I created

    Code (CSharp):
    1. InvalidOperationException: Invalid user
    2. UnityEngine.InputSystem.Users.InputUser.get_index () (at Library/PackageCache/com.unity.inputsystem@1.5.1/InputSystem/Plugins/Users/InputUser.cs:86)
    3. UnityEngine.InputSystem.Users.InputUser.UnpairDevice (UnityEngine.InputSystem.InputDevice device) (at Library/PackageCache/com.unity.inputsystem@1.5.1/InputSystem/Plugins/Users/InputUser.cs:600)
    4. CustomVIrtualMouseCursor.OnDisable () (at Assets/Samples/Input System/1.5.1/Gamepad Mouse Cursor/CustomVIrtualMouseCursor.cs:43)
    Here the full code
    Code (CSharp):
    1. using System.Collections;
    2. using System.Collections.Generic;
    3. using UnityEngine;
    4. using UnityEngine.InputSystem;
    5. using UnityEngine.InputSystem.Users;
    6. using UnityEngine.InputSystem.LowLevel;
    7. using System;
    8.  
    9. public class CustomVIrtualMouseCursor : MonoBehaviour
    10. {
    11.     [Space]
    12.     public PlayerInput playerInput;
    13.     [Space]
    14.     public RectTransform cursorTransform;
    15.     public RectTransform canvasTransform;
    16.     [Space]
    17.     public float cursorSpeed = 1000.0f;
    18.     public float padding = 35.0f;
    19.  
    20.     private Mouse virtualMouse;
    21.     private bool previousMouseState;
    22.  
    23.     private void OnEnable()
    24.     {
    25.         if (virtualMouse == null)
    26.             virtualMouse = (Mouse)InputSystem.AddDevice("VirtualMouse");
    27.         else if (!virtualMouse.added)
    28.             InputSystem.AddDevice(virtualMouse);
    29.  
    30.         InputUser.PerformPairingWithDevice(virtualMouse, playerInput.user);
    31.  
    32.         if (cursorTransform != null)
    33.         {
    34.             Vector2 position = cursorTransform.anchoredPosition;
    35.             InputState.Change(virtualMouse.position, position);
    36.         }
    37.  
    38.         InputSystem.onAfterUpdate += UpdateMotion;
    39.     }
    40.  
    41.     private void OnDisable()
    42.     {
    43.         playerInput.user.UnpairDevice(virtualMouse);
    44.  
    45.         InputSystem.RemoveDevice(virtualMouse);
    46.         InputSystem.onAfterUpdate -= UpdateMotion;
    47.     }
    48.  
    49.  
    50.     private void UpdateMotion()
    51.     {
    52.         if (virtualMouse == null || Gamepad.current == null || !Application.isPlaying)
    53.             return;
    54.  
    55.         Vector2 deltaValue = Gamepad.current.leftStick.ReadValue() * cursorSpeed * Time.unscaledDeltaTime;
    56.         Vector2 currentPosition = virtualMouse.position.ReadValue();
    57.  
    58.         Vector2 newPosition = currentPosition + deltaValue;
    59.  
    60.         newPosition.x = Mathf.Clamp(newPosition.x, padding, Screen.width - padding); // TODO: Add padding
    61.         newPosition.y = Mathf.Clamp(newPosition.y, padding, Screen.height - padding);
    62.  
    63.         InputState.Change(virtualMouse.position, newPosition);
    64.         InputState.Change(virtualMouse.delta, deltaValue);
    65.  
    66.         bool aButtonPressed = Gamepad.current.aButton.isPressed;
    67.         if (previousMouseState != aButtonPressed)
    68.         {
    69.             virtualMouse.CopyState<MouseState>(out var mouseState);
    70.             mouseState.WithButton(MouseButton.Left, aButtonPressed);
    71.             InputState.Change(virtualMouse, mouseState);
    72.  
    73.             previousMouseState = aButtonPressed;
    74.         }
    75.  
    76.         AnchorCursor(newPosition);
    77.     }
    78.  
    79.     private void AnchorCursor(Vector2 position)
    80.     {
    81.         Vector2 anchoredPosition;
    82.         RectTransformUtility.ScreenPointToLocalPointInRectangle(canvasTransform, position, null, out anchoredPosition);
    83.  
    84.         cursorTransform.anchoredPosition = anchoredPosition;
    85.     }
    86. }
     
  2. Mars91

    Mars91

    Joined:
    Mar 6, 2012
    Posts:
    572
    Tried with
    Code (CSharp):
    1.  
    2.         var player = PlayerInput.all[playerInput.user.index];
    3.         player.user.UnpairDevice(virtualMouse);
    Got the same error