Search Unity

  1. Welcome to the Unity Forums! Please take the time to read our Code of Conduct to familiarize yourself with the forum rules and how to post constructively.
  2. We have updated the language to the Editor Terms based on feedback from our employees and community. Learn more.
    Dismiss Notice

Rebinding - Excluding Certain Keys

Discussion in 'Input System' started by SilverFang180882, Apr 9, 2022.

  1. SilverFang180882

    SilverFang180882

    Joined:
    Mar 30, 2020
    Posts:
    35
    Hello,

    I've been working on a rebind system for my game's input system. I'm only allowing the player to rebind "action" controls (jump, melee, shoot, etc), but not the movement. I have both the WASD and the Arrow Key options enabled for movement, so the player can use whichever they prefer. I also want to prevent the player from rebinding Escape (pause button).

    So, my problem is that I don't know how to prevent the player from rebinding a movement key when rebinding a new input. To my rebinding code, I added:
    Code (CSharp):
    1. .WithControlsExcluding("Mouse")
    2.                     .WithControlsExcluding("Gamepad")
    3.                     .WithControlsExcluding("Joystick")
    4.                     .WithControlsExcluding("<keyboard>/escape")
    5.                     .WithControlsExcluding("<keyboard>/w")
    6.                     .WithControlsExcluding("<keyboard>/a")
    7.                     .WithControlsExcluding("<keyboard>/s")
    8.                     .WithControlsExcluding("<keyboard>/d")
    9.                     .WithControlsExcluding("<keyboard>/upArrow")
    10.                     .WithControlsExcluding("<keyboard>/downArrow")
    11.                     .WithControlsExcluding("<keyboard>/leftArrow")
    12.                     .WithControlsExcluding("<keyboard>/rightArrow")
    Now, this does prevent other devices from being rebinded (mouse, gamepads and joysticks). However, when I try to rebind one of the excluded keyboard keys, instead of doing nothing, the game will rebind the selected control to "Any Key".

    Is there a way I can prevent this? For it to not rebind the key at all if one of these keys is pressed, and instead switch on a condition?
    For example:
    If the player tries to rebind a movement key, it won't rebind at all, but makes the player rebind again, but also sets a boolean to true.
    (I wouldn't mind being able to do this for the excluded devices too)

    Here's my rebinding code in full:
    Code (CSharp):
    1. if (changing)       //If a button is being rebinded
    2.             {
    3.                 rebindingOperation = playerControls.GetComponent<PlayerInput>().actions["Shoot"].PerformInteractiveRebinding(0)
    4.                     .WithControlsExcluding("Mouse")
    5.                     .WithControlsExcluding("Gamepad")
    6.                     .WithControlsExcluding("Joystick")
    7.                     .WithControlsExcluding("<keyboard>/escape")
    8.                     .WithControlsExcluding("<keyboard>/w")
    9.                     .WithControlsExcluding("<keyboard>/a")
    10.                     .WithControlsExcluding("<keyboard>/s")
    11.                     .WithControlsExcluding("<keyboard>/d")
    12.                     .WithControlsExcluding("<keyboard>/upArrow")
    13.                     .WithControlsExcluding("<keyboard>/downArrow")
    14.                     .WithControlsExcluding("<keyboard>/leftArrow")
    15.                     .WithControlsExcluding("<keyboard>/rightArrow")
    16.                     .OnMatchWaitForAnother(0.1f)
    17.                     .OnComplete(operation => RebindComplete()).Start();
    18.                 changing = false;       //Ensure the rebinding process doesn't repeat
    19.             }
    Is there also a way to rebind certain actions manually through script, without the player pressing something? When I create a way to rebind gamepads inputs, I plan to link gamepad and joystick inputs together (i.e. if one action is rebinded to Button South on a Gamepad, it'll automatically rebind the Joystick binding of that same action to button3 as well.

    Thanks in advance.
     
    ChaosBeFall likes this.
  2. AlexMasse

    AlexMasse

    Joined:
    Jun 29, 2014
    Posts:
    19
    I'm having the same issue

    EDIT: I just added this and it solved my problem
    Code (CSharp):
    1. .WithControlsExcluding("<keyboard>/anyKey")
     
    Last edited: Jul 13, 2022
    jukibom, ChaosBeFall and Liderangel like this.
  3. egor-7355

    egor-7355

    Joined:
    Sep 29, 2016
    Posts:
    5
    haha this is crazy! this system is seriously lacking in tutorials
    thanks for sharing, this works
     
  4. syjgin

    syjgin

    Joined:
    Feb 13, 2015
    Posts:
    136
    Unity is so Unity:)
    Had the same issue