unity inputsystem 关于运行时重新绑定快捷键

想要实现一个快捷键自定义功能,遇到了一个问题。

img

如何再运行时,修改上图中复制模式的快捷键,这涉及到一个binding类型的变化,官方文档中提供的API只支持相同类型的重新绑定。

目前我还没找到文档中关于将binding类型重新绑定为Composite类型的方法。

操作环境:PC; Keyboard(键盘)
inputSystem版本:1.5.0

本人愿意为知识付费,请各位同学不要担心。有回必应哦。

令附已知的知识点:
1.首先 相同类型的重新绑定 官方插件就有完整的demo 此类回答就不会被采纳了。
2.ApplyBindingOverride 这个API也不行。
3.如果是建议自己写一套实现的话这个我考虑过,两个原因 一个是需要一定的时间成本 二是后续插件迭代维护需要频繁修改很麻烦。

在Unity Input System中,运行时重新绑定快捷键可以通过以下步骤实现:

  1. 获取当前的InputActionMap:使用InputActionAsset.FindActionMap方法获取包含要修改的快捷键的InputActionMap对象。

  2. 获取要修改的InputAction:使用InputActionMap.FindAction方法获取要修改的具体InputAction对象。

  3. 移除旧的Binding:使用InputAction.RemoveBinding方法移除当前绑定的快捷键。

  4. 创建新的Composite Binding:使用InputBindingComposite.Create方法创建一个新的Composite类型的绑定。

  5. 添加新的Binding:使用InputAction.AddBinding方法将新创建的Composite绑定添加到输入动作中。

下面是一个示例代码片段,演示了如何将复制模式(Copy Mode)的快捷键重新绑定为Composite类型:

using UnityEngine;
using UnityEngine.InputSystem;

public class ShortcutRebinding : MonoBehaviour
{
    public InputActionAsset inputActions; // 引用你创建好的 Input Action Asset

    private void Start()
    {
        // 获取 Input Action Map
        var actionMap = inputActions.FindActionMap("YourActionMapName");

        // 获取要修改的 Input Action
        var action = actionMap.FindAction("YourCopyModeActionName");

        // 移除旧 Binding
        action.RemoveBinding("<your_old_binding>");

        // 创建新 Composite Binding
        var composite = InputBindingComposite.Create("<your_composite_type>");
        
        // 添加新 Binding
        action.AddBinding(composite);
    }
}

Unity InputSystem 目前的版本(1.5.0)确实不提供直接将 binding 类型重新绑定为 Composite 类型的方法。官方文档中也没有提供针对此类需求的特定 API。

如果你想在运行时修改复制模式的快捷键,并且需要改变 binding 类型为 Composite 类型,目前的解决方案可能是自己编写一套实现逻辑。这样做确实会需要一定的时间成本,并且后续插件的迭代和维护也可能带来一些麻烦。

另外,你可以考虑尝试查看 Unity InputSystem 的源码,了解其内部实现和数据结构。这样可能会发现一些隐藏的 API 或者修改方式,但这需要你对 Unity 的底层输入系统有一定的了解。

总的来说,如果当前版本的 Unity InputSystem 无法满足你的需求,你可能需要进行额外的开发工作或者等待未来版本的更新。希望以上信息对你有所帮助!

交互式绑定 InputAction.PerformInteractiveRebinding()方法
参考
https://docs.unity3d.com/Packages/com.unity.inputsystem@1.1/manual/ActionBindings.html@1.1/manual/ActionBindings.html

【unity教程】Unity新输入系统按键重绑定以及生成c#代码
可以参考这个例子
https://www.bilibili.com/video/av422461846/

在Unity中,可以使用InputSystem Package来处理输入,并且可以在运行时重新绑定快捷键。以下是一些步骤来实现运行时重新绑定快捷键:

  1. 在Unity中,确保已经安装了InputSystem Package。可以通过PackageManager来安装该包。

  2. 创建一个新的C#脚本,用于处理输入和重新绑定快捷键。例如,可以创建一个名为InputHandler的脚本。

  3. 在InputHandler脚本中,使用以下代码来读取和处理输入:

using UnityEngine;
using UnityEngine.InputSystem;

public class InputHandler : MonoBehaviour
{
    private PlayerInput playerInput;

    private void Awake()
    {
        playerInput = GetComponent<PlayerInput>();
        playerInput.onActionTriggered += OnActionTriggered;
    }

    private void OnActionTriggered(InputAction.CallbackContext context)
    {
        // 处理输入逻辑
        // 根据输入的快捷键执行对应的操作
    }
}

注意,这里假设已经把PlayerInput组件添加到了脚本所在的GameObject中。

  1. 在InputHandler脚本中,可以使用InputSystem的重新绑定功能来允许用户重新绑定快捷键。例如,可以添加一个方法来处理重新绑定:
public void RebindKey(string actionName)
{
    playerInput.actions.FindAction(actionName).Disable(); // 禁用对应的输入动作

    var rebindOperation = playerInput.actions.FindAction(actionName).PerformInteractiveRebinding() // 执行重新绑定操作
        .OnMatchWaitForAnother(0.1f)
        .OnComplete(operation =>
        {
            // 绑定完成时的回调处理
            operation.Dispose();
        })
        .Start();
}

这里的RebindKey方法接受一个参数actionName,表示要重新绑定的输入动作的名称。它首先禁用对应的输入动作,然后执行重新绑定操作,并在绑定完成时进行回调处理。

  1. 在InputHandler脚本中,可以添加一个公共方法来处理用户触发重新绑定的事件。例如,可以在UI按钮点击事件中调用该方法:
public void OnRebindButtonClick(string actionName)
{
    RebindKey(actionName);
}

这里的OnRebindButtonClick方法接受一个参数actionName,表示要重新绑定的输入动作的名称。它会调用RebindKey方法来执行重新绑定。

通过以上步骤,可以实现在运行时重新绑定快捷键。可以根据具体的需求在OnActionTriggered方法中处理输入逻辑,并通过调用RebindKey方法来触发重新绑定操作。