untiy 新输入系统 InputSytem

news2025/2/26 6:04:18

文章目录

    • 一 前言
    • 二 安装
    • 新建一个输入资产
    • 三 InputActions面板
      • 区域1 工具栏
        • controlSchemes 控制方案
        • saveAsset和Auto-Save
      • 区域2 actionMaps 动作映射集
      • 区域3 actions 区域4 属性面板
        • 1 action与bingding的创建与删除
        • 2 action的属性
        • 3 Bindin属性
        • 4 实例演示,创建一个跳跃action
    • 四 C#调用InputsSystem
      • 方法1 传统高耦合方式调用
      • 方法2 使用PlayerInput组件
      • 方法3 创建C#脚本
      • 切换输入控制集
      • 重新绑定按键 恢复默认按键
        • 为action重新指定按键
        • 保存并加载修改后的按键绑定
        • 恢复默认按键
      • 获取action和名字和action绑定的按键

一 前言

新输入系统的名字就叫InputSystem,新是相对于旧的InputManager来说的

核心思想是添加一个动作(action)的概念,代码只监听动作的触发,由动作去绑定物理输入,这样无论什么平台,无论如何重新指定物理输入,我们都不需要修改代码。
同时也可以将同一个物理输入同时绑定到不同的输入动作集中,随时切换输入动作集,例如上车后,从走路的动作集切换到开车的动作集。

此外还提供了一些方便的功能,例如使用代码重新绑定按键、屏幕按键等、检测设备接入拔出、组合键、次要绑定等。

二 安装

InputSystem不是默认安装的,我们需要使用packagemanager来安装他。
建议使用2019之后的版本
打开packageManager,在unityRegistery里搜索,然后安装即可,安装过程中你的编辑器会需要重启一次。
如果你打开包管理器不显示包,那么你需要退出编辑器,刷新一下通行证,重新打开即可。
在这里插入图片描述

新建一个输入资产

有两种方法可以创建输入
1 通过Project面板右键菜单Create/InputAction创建一个新的输入资产,这将创建一个全新的资产。
2 为一个物体添加一个PlayerInput组件,点击create按钮,这会创建一个带有默认输入的资产。
在这里插入图片描述
创建新的输入资产的时候必须小心的命名,不要随便起个名字,因为之后创建的带有输入动作的c#脚本会叫这个名字,瞎起名字是给自己找麻烦

三 InputActions面板

这个面板的作用是管理一个InputActionAssets的action和对应的映射。
双击一个输入资产即可打开这个面板。
在这里插入图片描述
以下是详细解释

区域1 工具栏

controlSchemes 控制方案

在这里插入图片描述
默认是只有AllControlSchemes的,可以使用AddControlScheme创建新的输入方案,随后可以为action的一个物理输入指定自己的输入方法,当我们切换输入方案时,就可过滤这个方案下的action了,注意方案只是一个名字,没有任何实际意义,你完全可以起一个名字叫gamepad的方案,但是为keyboard action指定这个方案。

删除控制方案时,如果由物理输入会让我们选择是否要连同绑定的物理输入一同删除,选yes会删除所有指定为当前方案的物理输入绑定,选no只会删除这个控制方案,而保留绑定的物理输入
在这里插入图片描述

saveAsset和Auto-Save

不建议使用Auto-Save,因为我们需要为aciton创建一个c#文件才能在脚本中调用,使用了Auto-Save时,如果我们已经创建了这个脚本,每当我们做出改变,都会重新编译脚本,这将非常痛苦

区域2 actionMaps 动作映射集

我们可以在这里定义不同的映射集,走路动作映射集、开车动作映射集、UI动作集等
点击+号即可创建新的动作集

区域3 actions 区域4 属性面板

这两个要一起看
actions: 一个actionMaps里的所有action,用于创建action并为action绑定物理按键
Properties: action或binding的属性

1 action与bingding的创建与删除

点击atcions的加号即可创建一个新的action(绿色),新action默认自带一个绑定(蓝色),只不过目前这个绑定还没有绑定任何物理按键
在这里插入图片描述
右键action即可删除action
点击action后的+号并选择一个绑定类型即可创建一个新的bingding(蓝色)
右键bindging即可选择删除

2 action的属性

Action 这是action属性栏里第一个属性
创建好aciton后,我们第一步要确定action的类型,选中一个action(绿色),右侧属性面板会显示这个action的选项
有value和button和Pass Through三种类型

  • value:可以将输入转化为值,可以在ControlType属性中选择具体的类型,通常使用Axis(一维)、Vector2、Vector3,通常用来制作移动、视角旋转、读取摇杆输入值等。
  • button:按下触发,没什么好说的
  • Pass Through: 例如你插了多个手柄,那么所有的手柄都会同时影响这个action,上面两种方式是只有当前有输入传入的手柄会影响这个action,除非你希望你的action同时被多个物理设备控制,否则不要使用这个选项

注意修改了aciton的类型后,会影响action可以创建的物理输入的选项
在这里插入图片描述
Interactions 如何交互
可以指定这个action如何交互
点击+号添加一个新的交互方式
常用的交互有Hold按住一段时间后触发,MultiTop,多次点击等,见名知意,不多废话。
如果什么都不加,则为默认的交互方式。
Processors 定义如何处理获取到的值
可选项有

  • Axis Deadzone:轴死区 当摇杆输入小于Min,不会触发摇杆,通常用于防止摇杆漂移问题。如果输入大于Max,认为都是1。在Min和Max之间插值
  • Clamp:钳制输入的值,不能小于Min,不能大于Max
  • Invert: 翻转输入的值,例如输入的值为1,则实际得到的值为-1
  • Normalize: 归一化值,你总能得到1 0 -1,通常用于摇杆
  • Scale:缩放输入的值
3 Bindin属性

创建绑定的注意事项
点击一个action后的+号,然后选择一个具体类型,即可创建一个绑定
根据action的类型不同,可以选择的binding类型是不同的
当action的ActionType为Button时,我们可以创建的类型有

  • Binding:普通按钮,只能绑定一个按键
  • Positive/Negative:,需要分别为Positive和Negative绑定两个按键
  • Binding With Modifier: 组合键

当action为Value类型时,我们可以创建的类型通常有Binding和Up/Down/Left/Right,显然这是用来用键盘控制方向的
在这里插入图片描述
这里绑定类型过多,无法全部列举,但我们最常用的就是Button和键盘摇杆的轴输入
绑定一个物理输入
新创建的binding是没有按键绑定的,需要我们手动绑定。
选中一个binding,点击他的属性栏里的Binding分类,然后点击Path/Listen,然后按下按键或移动摇杆,再从监听到的列表里点选我们需要的输入即可
在这里插入图片描述在这里插入图片描述
例如我按下了space键,我就在列表里选择space键,注意你可以按下多个按键。

对于摇杆,例如你坚挺了XBOX的摇杆,你可选择这个动作是仅用于Xbox还是通用的,如果是通用的,使用其他品牌的摇杆按下对应的键同样可以起作用,否则只会相应Xbox摇杆,如下图,第一选项是通用输入,第二选项是仅相应Xbox摇杆。
在这里插入图片描述
为绑定选择一个ControlSchemes
如果我们之前建立了一个控制方案,我们可以为这个Binding指定属于的控制方案,这方便我们过滤。
如何新建控制方案可以参考本章“区域一”部分。
Interactions和Processors
和action相同,只不过banding的这两个选项会覆盖action的。

4 实例演示,创建一个跳跃action

请添加图片描述

四 C#调用InputsSystem

这里介绍三中监听输入的方式,但是只有第三种是重要的,前两种知道就行。

方法1 传统高耦合方式调用

虽然inputSystem提供了acion这个概念,但我们同样可以直接去访问键盘按键
首先引入nameSpace

using UnityEngine.InputSystem;
//键盘
if (Keyboard.current.aKey.wasPressedThisFrame)
{
     print("A键按下");
}
//鼠标输入
print(Mouse.current.delta.ReadValue());
//鼠标按下
if(Mouse.current.leftButton.wasPressedThisFrame)
{

}

这种用法最好只用来做测试,不要真的用它做项目,因为他还没InputManager好用,至少InputManagerAPI更好找。

方法2 使用PlayerInput组件

为一个物体挂载一个PlayerInput组件,然后选择一个InputAcionsAssets。
在这里插入图片描述
使用DefaultMap选择一个acitonMaps。
使用Behavior来选择一个消息传递方式,这里推荐用第3,4个,以下分别介绍这两种模式
InokeUnityEvnets:
这个模式的优点在于可以直接拖拽事件
在这里插入图片描述
切换到Behavior的第三个模式后,会出现Events选项,其中Player和UI是我创建的两个actionMaps,其中Jump和 Movement是Player这个acionMaps里的两个action,我们需要如何只需像给UIButton绑定事件一样,为action拖拽事件即可。
我们可以这样声明事件:

//有参
 public void Jump(InputAction.CallbackContext context)
    {
        //Debug.Log(context);
        //context.performed||context.started||context.canceled 按下 开始按 松开
        if (context.performed)//只在按下时触发
        {
            rig.AddForce(Vector3.up * 5f, ForceMode.Impulse);
        }
    }
    //无参
    public void Jump()
    {
        rig.AddForce(Vector3.up * 5f, ForceMode.Impulse);
    }

需要注意的是,一个按钮被按下时,会触发3次事件,因为一个按钮包含三个阶段,开始按/按下/松开,所以我们最好用带参的方法绑定事件,并自行在方法中判断阶段

Inoke CSharp Evnets
在这里插入图片描述
这种方式需要我们在脚本里查找inputManager组件,并绑定委托,类似于用脚本为UIButton绑定事件

 private Rigidbody rig;
    private PlayerInput playerInput;
    private void Start()
    {
        playerInput = GetComponent<PlayerInput>();
        //查找组件的方式切换输入控制集
        playerInput.SwitchCurrentActionMap("Player");
        playerInput.onActionTriggered += PlayerInput_onActionTriggered;
    }
    private void PlayerInput_onActionTriggered(InputAction.CallbackContext obj)//使用InvokeCSharpEvents模式监听事件
    {
        Debug.Log(obj);
    }

方法3 创建C#脚本

这是唯一推荐使用的方式
首先我们要生成c#文件
找到InputActionAssets,勾选生成C#类,即可自动生成c#类,此时最好关闭InputAcionts面板的Auto-Save选项,否则每次我调整输入,都会立刻重新生成这个类
在这里插入图片描述

生成的c#类名字和InputAcionsAssets名字相同,这就是为什么不要乱起名字。

在代码中监听action按键输入,获取value类型的值
目前的输入资产
在这里插入图片描述

编写脚本

 	PlayerInputActions playerInputActions;
    private void Start()
    {
        playerInputActions = new PlayerInputActions();注意是new 一个对象,不是查找组件
        playerInputActions.Player.Enable();//激活一个控制集 注意必须要激活一个acitonMaps
        playerInputActions.Player.Jump.performed += Jump;//绑定事件
        playerInputActions.Player.Movement.performed += Movement_performed;//按一下动一下,做移动输入应该按下方FixedUpdate里的方式,这里只是演示如何做值类型的输入监听
    }
    private void FixedUpdate()
    {
    	//直接监听value类型的action的输入
        Vector2 inputVector = playerInputActions.Player.Movement.ReadValue<Vector2>();
     	Debug.Log(inputVector);
    }

	//注册跳跃的方法
    public void Jump(InputAction.CallbackContext context)
    {
        Debug.Log(context);
    }
    //注册移动的方法
    public void Movement_performed(InputAction.CallbackContext context) 
    {
        Vector2 inputVector = context.ReadValue<Vector2>();//读取value类型的action,注意泛型要用和输入匹配的类型
        float speed = 5f;
        rig.AddForce(new Vector3(inputVector.x, 0, inputVector.y) * speed, ForceMode.Force);
    }


非常简单

切换输入控制集

        playerInputActions = new PlayerInputActions();
        //C#方式切换输入控制集
        playerInputActions.UI.Disable();//禁用一个actionMaps
        playerInputActions.Player.Enable();//启用一个actionMaps

重新绑定按键 恢复默认按键

为action重新指定按键
//重新绑定按键,重新绑定按键前,需要确保已经关闭了所有的输入动作集,否则一旦开启监听,就会立刻绑定当前输入的值,这里边肯定有我们不想要的值,例如鼠标位置,滑移的摇杆等
            playerInputActions.Player.Disable();
            playerInputActions.UI.Disable();
            playerInputActions.Player.Jump.PerformInteractiveRebinding(0)//参数0 修改首要绑定 1 修改次要绑定 默认为0
                .WithCancelingThrough(Keyboard.current.escapeKey)//指定一个按键用于取消重新绑定
                .OnCancel(callBack =>
                {
                    print("取消绑定");
                    callBack.Dispose();//取消绑定要释放资源
                    playerInputActions.Player.Enable();//重新激活输入动作
                })
                .WithControlsExcluding("Mouse")//禁止绑定鼠标按键 参数的值可以从绑定界面看一下都有什么输入分类
                .OnComplete(callback =>
                {
                    Debug.Log("结束绑定");
                    callback.Dispose();//完成重新绑定后需要释放对象
                    playerInputActions.Player.Enable();//重新激活输入动作
                })
                .Start();//开始监听重新绑定的按键
保存并加载修改后的按键绑定

如果我们不手动保存重新绑定的按键,那么下次启动时,还是会使用最开始的按键
我们手动保存了按键后,每次启动,都需要读取,并且重新赋值给inputsystem
在绑定的OnComplete()里添加保存

.OnComplete(callback =>
                {
                    Debug.Log("结束绑定");
                    Debug.Log(callback);
                    
                    //inputSystem1.1版本以后的保存重新绑定方式
                    string rebinds = callback.action.SaveBindingOverridesAsJson();
                    PlayerPrefs.SetString("rebinds", rebinds);//静态方法,参数1 固定字符串,表示重新绑定
                    print("重新绑定的内容" + rebinds);

                    callback.Dispose();//完成重新绑定后需要释放对象
                    playerInputActions.Player.Enable();//重新激活输入动作
                })
``
在游戏启动时读取上次保存的重新绑定json

```csharp
        playerInputActions = new PlayerInputActions();
        //C#方式切换输入控制集
        playerInputActions.Player.Enable();
        string rebinds = PlayerPrefs.GetString("rebinds");
        playerInputActions.LoadBindingOverridesFromJson(rebinds);
恢复默认按键
playerInputActions.Player.Jump.RemoveBindingOverride();

获取action和名字和action绑定的按键

        playerInputActions = new PlayerInputActions();
        playerInputActions.Player.Enable();

        print(playerInputActions.Player.Jump.name);//action的名字
        print(playerInputActions.Player.Jump.GetBindingDisplayString(1));//列出次要绑定  参数为0是首要绑定
        print(playerInputActions.Player.Jump.GetBindingDisplayString());//列出action的首要和次要绑定

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1126678.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

最详细STM32,cubeMX 超声波测距

这篇文章将详细介绍 STM32使用 cubeMX驱动超声波测距 。 文章目录 前言一、超声波模块测距原理 &#xff1a; 二、cubeMX 配置三、实验程序总结 前言 实验材料&#xff1a;STM32F103C8T6开发板&#xff0c; HC-SR04 超声波模块。所需软件&#xff1a;keil5 &#xff0c; cubeM…

二叉搜索树进阶--AVL树详细实现过程

目录 AVL树概念AVL树实现AVL树基础结构插入插入&#xff1a;左旋实现插入&#xff1a;右旋实现 AVL树完整实现代码&#xff1a; 之前学习到的二叉搜索树虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序二叉搜索树将退化为单支树&#xff0c;查找元素相当于在顺序表中…

【C语言】popen()函数详解

popen函数详解 一、函数介绍二、使用实例 一、函数介绍 头文件#include <stdio.h>函数原型FILE *popen(const char *command, const char *type); 功能&#xff1a;popen()函数通过先创建一个管道&#xff0c;然后调用 fork 产生一个子进程&#xff0c;让子进程执行shel…

nvm的安装,使用及命令

nvm的安装&#xff0c;使用及命令 nvm工具1.nvm的安装基于node的开发nvm是什么nvm下载nvm安装 2.nvm的命令3.nvm的使用 nvm工具 nvm是什么 nvm下载与安装 nvm的基本使用1.nvm的安装 基于node的开发 在介绍nvm之前&#xff0c;先介绍下前端开发中关于node的使用。目前前端不管…

Allegro如何交换两个器件的位置操作指导

Allegro如何交换两个器件的位置操作指导 在用Allegro进行PCB设计的时候,交换两个器件的位置是使用的十分频繁的操作,如下图 需要将两个器件的位置交换,可以手动移动,然后交换下位置,但是Allegro支持快速将两个器件的位置对调 具体操作如下 点击Place点击Swap

【Javascript】数组练习(将字符串“ab,cd,ef,gh“转化成数组,并且删除“cd“)

将字符串"ab,cd,ef,gh"转化成数组&#xff0c;并且删除"cd“ var strab , cd , ef , gh; 调用split函数将字符串转化为数组 var strab , cd , ef , gh;var liststr.split(,);console.log(list); 调用splice方法在数组中删除cd var strab , cd , ef , gh;var …

TCP通信实战案例-模拟BS系统[了解]

前言 1、之前的客户端都是什么样的&#xff1f; 其实就是CS架构&#xff0c;客户端实需要我们自己开发实现的。 2、BS结构是什么样的&#xff0c;需要开发客户端吗&#xff1f; 浏览器访问服务端&#xff0c;不需要开发客户端。 实现BS开发 注意&#xff1a;服务器必须给浏…

C++左值引用与右值引用

0.类型和值类别的区别&#xff1f; 类型&#xff08;type&#xff09;和值类别&#xff08;value category&#xff09; 1.类型指的是数据类型&#xff0c;int&#xff0c;char这样的内置类型&#xff0c;类型主要是用来区别它们的字节大小。除了内置类型还有自定义类型&…

前端构建但没有更新

使用jenkins构建vue前端代码时&#xff0c;构建完成后&#xff0c;jenkins提示构建成功&#xff0c; 但前端刷新提示还是原来的效果&#xff0c;此时需要查看下jenkins构建日志&#xff0c;如果出现下面的文字&#xff0c;说明缺少依赖&#xff0c;最新的代码并没有构建到项目中…

QT-opengl编译错误

问题1&#xff1a; QT编译错误&#xff1a;undefined reference to __imp_gl* 解决方案 在工程*.pro文件中加入 win32:LIBS -lOpengl32 \-lglu32 win32-msvc{LIBS opengl32.lib \glu32.lib \glut.lib}问题2&#xff1a; 解决方案&#xff1a; 改变变量名称&#xff1a; 改…

WebSocket—STOMP详解(官方原版)

WebSocket协议定义了两种类型的消息&#xff08;文本和二进制&#xff09;&#xff0c;但其内容未作定义。该协议定义了一种机制&#xff0c;供客户端和服务器协商在WebSocket之上使用的子协议&#xff08;即更高级别的消息传递协议&#xff09;&#xff0c;以定义各自可以发送…

VM虚拟机 13.5 for Mac

VMware Fusion Pro for Mac是一款强大的虚拟机软件&#xff0c;可以在Mac操作系统中创建、运行和管理多个虚拟机&#xff0c;使用户可以在一台Mac电脑上同时运行多个操作系统和应用程序。 以下是VMware Fusion Pro for Mac的主要特点&#xff1a; 1. 支持多种操作系统&#xff…

CC攻击演示

选择一个代参数网站 未攻击前的cpu 用工具进行CC攻击 执行攻击会把目标主机占用内存&#xff0c;可以在把次数加大一点

(十二)Python文件操作(I/O)

和其它编程语言一样&#xff0c;Python 也具有操作文件&#xff08;I/O&#xff09;的能力&#xff0c;比如打开文件、读取和追加数据、插入和删除数据、关闭文件、删除文件等。 除了提供文件操作基本的函数之外&#xff0c;Python 还提供了很多模块&#xff0c;例如 fileinpu…

前端学成在线项目详细解析三

19-推荐课程-内容样式 HTML结构 <ul><li><a href"#"><div class"pic"><img src"./uploads/course01.png" alt""></div><div class"text"><h4>JavaScript数据看板项目实战…

旋转数组的最小值

文章目录 1 题目2 思路2.1 思路12.2 思路2 3 实现3.1 暴力3.2 二分查找 1 题目 将一个数组最开始的若干元素搬到数组的末尾&#xff0c;称之为数组的旋转。输入一个已排好序数组的一个旋转&#xff0c;求该旋转数组的最小元素。如&#xff0c;数组{3&#xff0c;4&#xff0c;…

linux文件存储之inode,硬链接,软链接详解

1.什么是inode 首先linux一切皆文件&#xff0c;一切皆文本流 inode &#xff0c;中文译名“索引节点”&#xff0c;也叫“i节点” 文件储存在硬盘上&#xff0c;硬盘的最小存储单位叫做”扇区”&#xff08;Sector&#xff09;。每个扇区储存512字节&#xff08;相当于0.5KB&a…

基于Java的校园餐厅订餐管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09; 代码参考数据库参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…

塔望3W消费战略全案丨轻食植物基,突围侧翼战

植鲜生 客户&#xff1a;民强&#xff08;昆山&#xff09;食品科技有限公司 品牌&#xff1a;植鲜生 时间&#xff1a;2021年起 项目部分内容保密期 突破传统植物基禁锢 破局轻食新赛道 民强&#xff08;昆山&#xff09;食品科技有限公司是一家集研发、生产、销售为一体…

详细讲解MySQL中的数据类型

详细讲解MySQL中的数据类型 一&#xff0c;整数类型 MySQL中常用的整数类型包括&#xff1a; TINYINT&#xff1a;占用1字节&#xff0c;表示范围为-128到127的有符号整数或0到255的无符号整数。 SMALLINT&#xff1a;占用2字节&#xff0c;表示范围为-32768到32767的有符号整…