想要实现一个快捷键自定义功能,遇到了一个问题。
如何再运行时,修改上图中复制模式的快捷键,这涉及到一个binding类型的变化,官方文档中提供的API只支持相同类型的重新绑定。
目前我还没找到文档中关于将binding类型重新绑定为Composite类型的方法。
操作环境:PC; Keyboard(键盘)
inputSystem版本:1.5.0
本人愿意为知识付费,请各位同学不要担心。有回必应哦。
令附已知的知识点:
1.首先 相同类型的重新绑定 官方插件就有完整的demo 此类回答就不会被采纳了。
2.ApplyBindingOverride 这个API也不行。
3.如果是建议自己写一套实现的话这个我考虑过,两个原因 一个是需要一定的时间成本 二是后续插件迭代维护需要频繁修改很麻烦。
在Unity Input System中,运行时重新绑定快捷键可以通过以下步骤实现:
获取当前的InputActionMap:使用InputActionAsset.FindActionMap
方法获取包含要修改的快捷键的InputActionMap对象。
获取要修改的InputAction:使用InputActionMap.FindAction
方法获取要修改的具体InputAction对象。
移除旧的Binding:使用InputAction.RemoveBinding
方法移除当前绑定的快捷键。
创建新的Composite Binding:使用InputBindingComposite.Create
方法创建一个新的Composite类型的绑定。
添加新的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来处理输入,并且可以在运行时重新绑定快捷键。以下是一些步骤来实现运行时重新绑定快捷键:
在Unity中,确保已经安装了InputSystem Package。可以通过PackageManager来安装该包。
创建一个新的C#脚本,用于处理输入和重新绑定快捷键。例如,可以创建一个名为InputHandler的脚本。
在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中。
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,表示要重新绑定的输入动作的名称。它首先禁用对应的输入动作,然后执行重新绑定操作,并在绑定完成时进行回调处理。
public void OnRebindButtonClick(string actionName)
{
RebindKey(actionName);
}
这里的OnRebindButtonClick方法接受一个参数actionName,表示要重新绑定的输入动作的名称。它会调用RebindKey方法来执行重新绑定。
通过以上步骤,可以实现在运行时重新绑定快捷键。可以根据具体的需求在OnActionTriggered方法中处理输入逻辑,并通过调用RebindKey方法来触发重新绑定操作。