【Unity_Input System】Input System新输入系统(三)——在游戏中更换按键绑定

这篇具有很好参考价值的文章主要介绍了【Unity_Input System】Input System新输入系统(三)——在游戏中更换按键绑定。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

八、在游戏中更换按键绑定

1.Binding和CompositeBinding

  • Binding只由一个部分组成,一般绑定单个按键或者摇杆
  • CompositeBinding由两个以上部分组成,一般是用于将多个按键组成虚拟轴

更换按键绑定时,Binding和Composite Binding需要分别处理,对Composite Binding需要循环各个部分进行修改。

可以用InputBinding.isComposite来判断是否是Composite Binding

unity inputsystem绑定ui,Unity,unity

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CompositeBindingCheck : MonoBehaviour
{
    MyAction inputActions;
    private void Start()
    {
        inputActions = new MyAction();
        Debug.Log("WASD:" + inputActions.Player.Test1.bindings[0].isComposite);
        Debug.Log("Left Stick:" + inputActions.Player.Test1.bindings[1].isComposite);
    }

}

 控制台输出结果:

unity inputsystem绑定ui,Unity,unity

2.在UI中显示原本的按键绑定

1>显示Action名称

用到的API:InputAction.name

2>显示Binding名称

用到的API:InputAction.GetBindingDisplayString

using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.UI;

public class RebindButtonTest : MonoBehaviour
{
    //Action名
    public Text actionLabel;
    //Binding名
    public Text bindingLabel;
    [SerializeField]
    public InputActionReference actionReference;
    private void Start()
    {
        actionLabel.text = actionReference.name;
        bindingLabel.text = actionReference.action.GetBindingDisplayString(0, out string deviceLayoutName, out string controlPath);
    }

}

unity inputsystem绑定ui,Unity,unity

运行效果:

unity inputsystem绑定ui,Unity,unity

PS.InputActionReferrence是InputSystem的一个API,用来引用在InputActionAsset中已经设置过的InputAction,即使被引用的InputAction重命名,引用也不会丢失,

请查阅:Class InputActionReference | Input System | 1.3.0 (unity3d.com)

3.更换按键绑定

用到的API:InputAction.PerformInteractiveRebinding

请查阅:Class InputActionRebindingExtensions | Input System | 1.3.0 (unity3d.com)

How do I…? | Input System | 1.3.0 (unity3d.com)

注意Binding和Composite Binding需要分别处理,因为Composite Binding需要循环更换每个部分的按键绑定

下面的例子只是简单去测试怎么使用这个API去修改按键绑定,如果是实际项目需要,可以参考官方案例:Rebinding UI

using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.UI;

public class RebindButtonTest : MonoBehaviour
{
    //Action名
    public Text actionLabel;
    //Binding名
    public Text bindingLabel;
    //Binding的id
    public string bindingId;
    
    private int index;
    [SerializeField]
    public InputActionReference actionReference;
    private InputActionRebindingExtensions.RebindingOperation RebindOperation;
    private void Start()
    {
        //UI显示Action名
        actionLabel.text = actionReference.name;
        //获取BingdingID
        /* 这里只是为了简单,所以手动选择要修改的binding,并且获取它的id
         * 这个例子里面,第0层是WASD
         * 第1层是composite的第1个部分W
         * 第2层是composite的第2个部分S
         * 第3层是composite的第3个部分A
         * 第4层是composite的第4个部分D
         * 第5层是左摇杆
         */
        index = 0;
        bindingId = actionReference.action.bindings[index].id.ToString();
        //UI刷新Binding名
        UpdateLabel(index);
    }
    /// <summary>
    /// 开始替换
    /// </summary>
    /// <param name="index"></param>
    public void StartInteractiveRebind()
    {
        //获取bindingIndex,Bingdings数组的下标,从0开始,如果action为空返回false
        if (!CheckActionAndBinding(out int bindingIndex))
            return;

        // If the binding is a composite, we need to rebind each part in turn.
        if (actionReference.action.bindings[bindingIndex].isComposite)
        {
            var firstPartIndex = bindingIndex + 1;
            if (firstPartIndex < actionReference.action.bindings.Count && actionReference.action.bindings[firstPartIndex].isPartOfComposite)
                PerformInteractiveRebind(actionReference, firstPartIndex, allCompositeParts: true);
        }
        else
        {
            PerformInteractiveRebind(actionReference, bindingIndex);
        }
    }
    /// <summary>
    /// 获取bindingIndex,Bingdings数组的下标,从0开始,如果action为空返回false
    /// </summary>
    /// <param name="index"></param>
    private bool CheckActionAndBinding(out int bindingIndex)
    {
        bindingIndex = -1;
        if (actionReference == null)
            return false;
        bindingIndex = actionReference.action.bindings.IndexOf(x => x.id == new System.Guid(bindingId));
        return true;

    }
    private void PerformInteractiveRebind(InputAction action, int bindingIndex, bool allCompositeParts = false)
    {
        RebindOperation?.Cancel(); // Will null out m_RebindOperation.

        void CleanUp()
        {
            RebindOperation?.Dispose();
            RebindOperation = null;
        }

        // Configure the rebind.
        RebindOperation = action.PerformInteractiveRebinding(bindingIndex)
            .WithControlsExcluding("Mouse")//剔除鼠标
            .OnCancel(
                operation =>
                {
                    CleanUp();
                })
            .OnComplete(
                operation =>
                {
                    UpdateLabel(index);
                    CleanUp();

                        // If there's more composite parts we should bind, initiate a rebind
                        // for the next part.
                    if (allCompositeParts)
                    {
                        var nextBindingIndex = bindingIndex + 1;
                        if (nextBindingIndex < action.bindings.Count && action.bindings[nextBindingIndex].isPartOfComposite)
                            PerformInteractiveRebind(action, nextBindingIndex, true);
                    }
                });
        RebindOperation.Start();
    }
    /// <summary>
    /// UI刷新binding名
    /// </summary>
    /// <param name="index"></param>
    private void UpdateLabel(int index)
    {
        bindingLabel.text = actionReference.action.GetBindingDisplayString(index, out string deviceLayoutName, out string controlPath);
    }
}

unity inputsystem绑定ui,Unity,unity

unity inputsystem绑定ui,Unity,unity

运行效果:

 unity inputsystem绑定ui,Unity,unity

4.按键的保存

//Load:
var rebinds = PlayerPrefs.GetString("rebinds");
if (!string.IsNullOrEmpty(rebinds))
actions.LoadBindingOverridesFromJson(rebinds);

//Save:
var rebinds = actions.SaveBindingOverridesAsJson();
PlayerPrefs.SetString("rebinds", rebinds);

5.按键恢复默认设置

用到的API:InputAction.RemoveBindingOverride

请查阅:Class InputActionRebindingExtensions | Input System | 1.3.0 (unity3d.com)

using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.UI;

public class RebindButtonTest : MonoBehaviour
{
    //Action名
    public Text actionLabel;
    //Binding名
    public Text bindingLabel;
    //Binding的id
    public string bindingId;
    
    private int index;
    [SerializeField]
    public InputActionReference actionReference;
    private InputActionRebindingExtensions.RebindingOperation RebindOperation;
    private void Start()
    {
        //UI显示Action名
        actionLabel.text = actionReference.name;
        //获取BingdingID
        /* 这里只是为了简单,所以手动选择要修改的binding,并且获取它的id
         * 这个例子里面,第0层是WASD
         * 第1层是composite的第1个部分W
         * 第2层是composite的第2个部分S
         * 第3层是composite的第3个部分A
         * 第4层是composite的第4个部分D
         * 第5层是左摇杆
         */
        index = 0;
        bindingId = actionReference.action.bindings[index].id.ToString();
        //UI刷新Binding名
        UpdateLabel(index);
    }
    //开始替换
    public void StartInteractiveRebind()
    {
        //获取bindingIndex,Bingdings数组的下标,从0开始,如果action为空返回false
        if (!CheckActionAndBinding(out int bindingIndex))
            return;

        // If the binding is a composite, we need to rebind each part in turn.
        if (actionReference.action.bindings[bindingIndex].isComposite)
        {
            var firstPartIndex = bindingIndex + 1;
            if (firstPartIndex < actionReference.action.bindings.Count && actionReference.action.bindings[firstPartIndex].isPartOfComposite)
                PerformInteractiveRebind(actionReference, firstPartIndex, allCompositeParts: true);
        }
        else
        {
            PerformInteractiveRebind(actionReference, bindingIndex);
        }
    }
    //获取bindingIndex,Bingdings数组的下标,从0开始,如果action为空返回false
    private bool CheckActionAndBinding(out int bindingIndex)
    {
        bindingIndex = -1;
        if (actionReference == null)
            return false;
        bindingIndex = actionReference.action.bindings.IndexOf(x => x.id == new System.Guid(bindingId));
        return true;

    }
    private void PerformInteractiveRebind(InputAction action, int bindingIndex, bool allCompositeParts = false)
    {
        RebindOperation?.Cancel(); // Will null out m_RebindOperation.

        void CleanUp()
        {
            RebindOperation?.Dispose();
            RebindOperation = null;
        }

        // Configure the rebind.
        RebindOperation = action.PerformInteractiveRebinding(bindingIndex)
            .WithControlsExcluding("Mouse")//剔除鼠标
            .OnCancel(
                operation =>
                {
                    CleanUp();
                })
            .OnComplete(
                operation =>
                {
                    UpdateLabel(index);
                    CleanUp();

                        // If there's more composite parts we should bind, initiate a rebind
                        // for the next part.
                    if (allCompositeParts)
                    {
                        var nextBindingIndex = bindingIndex + 1;
                        if (nextBindingIndex < action.bindings.Count && action.bindings[nextBindingIndex].isPartOfComposite)
                            PerformInteractiveRebind(action, nextBindingIndex, true);
                    }
                });
        RebindOperation.Start();
    }
    /// <summary>
    /// UI刷新binding名
    /// </summary>
    /// <param name="index"></param>
    private void UpdateLabel(int index)
    {
        bindingLabel.text = actionReference.action.GetBindingDisplayString(index, out string deviceLayoutName, out string controlPath);
    }

    public void ResetToDefault()
    {
        if (!CheckActionAndBinding(out var bindingIndex))
            return;

        if (actionReference.action.bindings[bindingIndex].isComposite)
        {
            // It's a composite. Remove overrides from part bindings.
            for (var i = bindingIndex + 1; i < actionReference.action.bindings.Count && actionReference.action.bindings[i].isPartOfComposite; ++i)
                actionReference.action.RemoveBindingOverride(i);
        }
        else
        {
            actionReference.action.RemoveBindingOverride(bindingIndex);
        }
        UpdateLabel(index);
    }
}

unity inputsystem绑定ui,Unity,unity

运行效果: 

unity inputsystem绑定ui,Unity,unity文章来源地址https://www.toymoban.com/news/detail-765717.html

到了这里,关于【Unity_Input System】Input System新输入系统(三)——在游戏中更换按键绑定的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 第五十二章 Unity Input System 新输入系统

    新输入系统InputSystem是2019年Unity新推出的插件。请注意,Unity默认使用旧的Input Manager,新的Input System处于未启用状态。当你安装Input System组件时,Unity会询问你是否启用新的输入系统。如果你选择Yes,Unity会启用新的并禁用旧的,之后编辑器将重新启动。具体的操作是,打开包

    2024年02月07日
    浏览(26)
  • Unity VR:XR Interaction Toolkit 输入系统(Input System):获取手柄的输入

    输入系统是 VR 应用中非常重要的一部分。我们通常需要获取 VR 手柄上某个按键的输入,然后将其作用到应用中,比如按下手柄的 Grip 键进行抓取。在我的其他 Unity XR Interaction Toolkit 的开发教程里,已经有介绍如何去获取手柄的输入。那么这篇教程我将做一个总结,将相关的

    2024年02月12日
    浏览(27)
  • Unity New Input System 及其系统结构和源码浅析【Unity学习笔记·第十二】

    转载请注明出处:🔗https://blog.csdn.net/weixin_44013533/article/details/132534422 作者:CSDN@|Ringleader| 主要参考: 官方文档:Unity官方Input System手册与API 官方测试用例:Unity-Technologies/InputSystem 如果c#的委托和事件不了解,参考我这篇:【C#学习笔记】委托与事件 (从观察者模式看C#的委

    2024年01月25日
    浏览(37)
  • 第五十章 Unity Input Manager 输入系统(上)

    Unity的输入系统支持多种输入设备,比如键盘和鼠标,游戏手柄,触摸屏,VR和AR控制器等等。Unity 通过两个独立的系统提供输入支持:第一,输入管理器 (Input Manager) 是 Unity 核心平台的一部分,默认情况下可用,属于旧的unity输入系统。第二,输入系统 (Input System) 是一个包,

    2024年02月10日
    浏览(31)
  • 第五十一章 Unity Input Manager 输入系统(下)

    本章节我们就来使用水平轴和垂直轴来控制游戏物体的移动和旋转。我们之前大致讲过,游戏物体移动最重要的是方向,速度和时间三个要素,同样旋转也是。接下来,我们将之前创建的地形场景导入进来,如下所示 然后将之前的“MecanimDemo”工程里面的模型文件和动画文件

    2024年02月03日
    浏览(32)
  • Unity SteamVR 开发教程:SteamVR Input 输入系统(2.x 以上版本)

    输入系统是 VR 开发中非常重要的一部分。我们通常需要获取 VR 手柄上某个按键的输入,然后将其作用到应用中,比如按下手柄的 Grip 键进行抓取,就需要在检测到“按下手柄 Grip 键”的输入操作时,执行抓取的行为。 SteamVR 插件是 Valve 提供给 Unity 开发者的用于开发 PCVR (头

    2024年02月08日
    浏览(35)
  • Unity 3D Input System的使用

    Input System是Unity新推出的输入系统,可以用作以前Input Manager的更具扩展性和可自定义性的替代方案。这里我将使用Unity 3D的Input System来实现一个FPS第一人称的游戏场景。 演示效果如下: 新建一个Unity 3D项目,在Asset Store里面下载StarterAssets - FirstPerson,然后在Package Manager里面导

    2024年02月20日
    浏览(26)
  • 游戏开发小结——Unity 2.5D 平台游戏:跳墙(新输入系统)

    到目前为止,在这个项目中,我已经介绍了如何创建具有双跳功能的物理基础角色控制器。我添加了动态平台、收藏品和事件驱动的电梯。 今天我将回到角色控制器脚本(Player)并添加墙跳功能。这将允许玩家检测墙壁的表面并从一堵墙跳到另一堵墙。 场景设置 我的场景有

    2024年02月01日
    浏览(28)
  • vue+element-ui input输入框设置属性type为number去除右边的上下按键

    当 input type=number 时,去掉后面的上下按钮 1.全局样式改变: 2.在style中使用的是vue+element,通常写当前页面的样式时使用scoped,防止篡改其他页面样式,但是这样会发现上面的代码失效,此时需要使用/deep/去寻找 【定义样式】去除表框、去除上下箭头、去除滚轮事件 3.在sty

    2024年02月11日
    浏览(37)
  • 【Unity学习笔记】New Input System 部分源码和测试用例补充

    转载请注明出处:🔗https://blog.csdn.net/weixin_44013533/article/details/135630016 作者:CSDN@|Ringleader| 主要参考: Unity官方Input System手册与API 【Unity学习笔记】Unity TestRunner使用 NewIputSystem主体内容请参见:【Unity学习笔记】第十二 · New Input System 及其系统结构 和 源码浅析 注:本文使用的

    2024年01月22日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包