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

news2024/11/17 0:03:13

新输入系统InputSystem是2019年Unity新推出的插件。请注意,Unity默认使用旧的Input Manager,新的Input System处于未启用状态。当你安装Input System组件时,Unity会询问你是否启用新的输入系统。如果你选择Yes,Unity会启用新的并禁用旧的,之后编辑器将重新启动。具体的操作是,打开包管理器(Windows -> Package Manager),在“Unity Registry”中找到 Input System插件,如下所示

我们点击右下角的“Install”安装

提示我们将使用新的输入系统,同时禁用旧的输入系统,我们点击“Yes”确认。

我们当前工程中就已经存在新的输入系统了。为了能够确认我们的工程中使用的那种输入系统,我们可以在Edit -> Project Settings 窗口中的Player选项进一步来核实。

 

我们看到在“Active Input Handing”一项中显示“Input System Package(New)”表示使用新的Input System输入系统。我们点击下拉还可以选择“Input Manager(Old)”或“Both”。很明显,“Input Manager(Old)”就是旧的Input Manager输入系统,而“Both”就是新旧输入系统都可以同时使用。

新的Input System有两种使用方式。第一种就是直接从输入设备获取输入;第二种就是基于 InputAction 输入动作来获取。我们重点介绍第二种 InputAction 输入动作。

首先,我们要理解如下概念:

InputAction:玩家的每一个输入都可以理解为是一个 InputAction(输入动作)。

InputActionMap:就是管理一些 InputAction 的一个集合(例如前后左右输入动作)。

InputController:就是管理具体硬件设备的输入(可以设置不同设备的按键)。

InputBinding:用于绑定 InputAction 和InputController(设备按键和输入动作关联)。

接下来,我们就来演示如何使用。

首先我们创建一个立方体Cube,然后为其添加一个 PlayerInput 组件。

 

添加好组件后,如果我们要接受到输入,还需要创建InputAction。我们可以点击组件上的Create Actions按钮来创建。点击后会弹出一个对话框,来选择存放生成的.inputactions文件路径。

我们可以定义这个.inputactions文件的名称,这里默认使用“NewInputProject”即可。保存路径就是Assets根目录下。这个文件其实就是一个配置文件(纯JSON格式存储),它包含了输入动作及其关联的绑定和控制方案。虽然它是一个文件,但是Unity提供了该文件的图形编辑界面。如下所示

最左边是两个Action Maps,他们分别是Player和UI。他们是Unity为我们提前预制的Action Maps。我们点击“Player”就会在右边的“Actions”中显示该集合下面的InputAction。我们看到分别有三个:Move,Look,Fire。我们继续点开查看下级具体的InputAction。例如,我们点开Move这个InputAction,它的下面就是多个InputBinding。注意InputBinding的类型不一样的话,它的设置也不一样的。

 

我们可以点击其中一个InputBinding,比如上图中的“WASD”。这个InputBinding根据名称我们大致理解,是用来控制上下左右四个方向的输入。因此它的下一级最少要设置四个方向(up,down,left,right)的输入配置。例如上图中的第一个输入设置“Up:W[Keyboard]”, 这个应该是键盘的字母W按键,对应的就是向上“Up”的输入信息。同时,我们可以在右边的“Binding Properties”中看到详细的配置。

Path 就是我们的设备按键。

Composite Part 应该是多个输入值的选项。

Use in control scheme 则是设备类型,他们的值含义如下

Keyboard&Mouse:键盘和鼠标

Gamepad:游戏手柄

Touch:触摸屏

Joystick:摇杆

XR:VR/AR设备

接下来,我们就手动添加一个自定义的“InputAction”

我们点击“Actions”右边的加号,添加一个新的“InputAction”,命名为“Test”。接下来,我们来查看“Test”右边的“Action Properties”界面。该界面一共有三个配置项:Action,Interactions和Processors。我们重点介绍Action里面的内容。Action Tpye来定义我们“InputAction”的类型,它一共有三个值可以选择:Value,Button和Pass-Through。

第一,Value:主要用于状态连续更改的输入,例如鼠标的移动,游戏手柄的摇杆等等。如果有多个设备绑定这个Action,只会发送当前使用设备的输入。

第二,Button :用于每次按下时触发的Action,就是普通的按键而已。默认值。

第三,Pass-Through:和Value一样,区别在于如果有多个设备绑定这个Action,会发送所有设备的输入。

接下来,我们就可以给我们的“Test”添加“InputBinding”绑定,这个“InputBinding”可以添加多个的,也就是说一个“InputAction”可以添加多个“InputBinding”。这里,我们添加一个就行了。我们点击“Test”右边的加号,我们可以添加不同类型的InputBinding。

我们稍微解释一下这个四个添加选项的含义:

Add Binding 普通的绑定,可以绑定一个按键,鼠标,游戏手柄等

Add Positive\NegativeBinding 两个按键的组合,一个代表正数,一个为负数

Add Button With One Modifier 需要同时按下两个按钮的组合,例如 ctrl + j

Add Button With Two Modifiers 需要同时按下三个按钮的组合,例如 shift + ctrl + j

其实我们发现在“Test”的下面就已经默认有一个<No Binding>了,它就是一个Add Binding普通的绑定,我们就直接使用它就可以了。请注意,这个“Test”和我们上面介绍的“WASD”是不一样的类型设置。我们点击选中它,然后查看右边的“Binding Properties”界面。

我们选择“Keyboard”键盘

我们选择“By Character Mapped to Key”

我们随便选择一个“M”字母按键

此时,Path处就会显示我们的“M”按键,我们在勾选“Keyboard&Mouse”一项即可完成“InputAction”的设置啦。接下来,我们回到“Player Input”组件中去。我们在该组件中找到“Behavior”行为一项,它的默认值是“Send Messages”,我们换成“Invoke Unity Events”。

选择完毕后,就会下面出现“Events”项目,在该项目的下面会有“Player”和“UI”两个子项目。大家应该能够猜到,这两个就是我们刚刚在“NewInputProject.inputactions”配置文件中显示的“Action Maps”。我们可以点开“Player”查看它的子项目

在最下面就会出现我们刚刚添加的“Test”的InputAction项目。接下来,我们需要创建一个脚本“TestScript.cs”文件,并且附加到Cube上面。

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

public class TestScript : MonoBehaviour
{
    public void OnTest()
    {
        Debug.Log("Input M");
    }
}

我们可以点击下面的加号添加上面的脚本,并将OnTest方法赋予我们的“Test” 的“InputAction”项目。如下所示

添加完之后,我们就可以运行整个工程了。

然后按下键盘上面的“M”按键测试。

总结:新的Input System在使用上与旧的Input Manager有很大的区别。旧的Input Manager虽然也是通过配置来设置很多的“虚拟轴”,然后在代码中获取“虚拟轴”来获取用户的输入,然后做进一步的处理。并且,这些代码都需要放置到Update方法中执行。而新的Input System系统也需要进行一些配置。显然,这些配置比旧系统更加复杂。新系统配置主要就是添加一个个的InputAction,每一个InputAction同可以绑定不同的输入设备上面的按键。这个InputAction非常类似旧系统中的“虚拟轴”。但是两者的区别在于,旧系统的设备输入是通过在代码中进行判断的;而新系统则是通过“Player Input”这个组件来获取,并指定脚本方法来执行的。从设计角度出发,旧系统只是对输入设备的封装,而新系统不仅是对输入设备的封装,还是对输入逻辑的封装。因此,新系统虽然复杂一下,但是去掉配置的内容之外(就是我们添加的inputactions文件,我们可以在这个文件中配置所有的输入情况),剩余的就是使用脚本方法来处理不同输入对应的游戏逻辑。新系统使得我们的代码书写结构更加清晰,每一个输入都对应一个脚本方法来处理,这个设计还是非常不错的。

本课程涉及的内容已经共享到百度网盘:https://pan.baidu.com/s/1e1jClK3MnN66GlxBmqoJWA?pwd=b2id

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

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

相关文章

8通道高速同步采集板卡设计原理图与调试经验中文资料分享

采集卡实物图及功能框图如下 青翼型号-FMC128 FMC128功能框图 FMC148实物图 FMC148功能框图 FMC168实物图 FMC168功能框图 板卡对比如下图 青翼型号 通道数 采集分辨率 采样率 FMC1288通道16bit250MSPSFMC14814bit500MSPS/1GSPS/1.25GSPSFMC1682GSPS/2.6GSPS/3GSPS 技术指标FM…

Android 套壳本地html 生成apk

参考了:https://www.jianshu.com/p/ebf7948f3796 首页是前端会给到你html文件 目录基本上是这样的 image.png 步骤1: 创建assets目录 用户安卓studio 新合建工程就不写了 &#xff0c;下面的图是如何创建assets资源目录&#xff1a; image.png image.png 步骤2&#xff1a;拷贝…

JVM-类加载机制

类的生命周期 ​ 其中类加载的过程包括了加载、验证、准备、解析、初始化五个阶段。在这五个阶段中&#xff0c;加载、验证、准备和初始化这四个阶段发生的顺序是确定的&#xff0c;而解析阶段则不一定&#xff0c;**它在某些情况下可以在初始化阶段之后开始&#xff0c;这是为…

ext-5 void GPIO1Pin23PinMuxSetup(void)含义

在阅读starterware里控制led的代码&#xff0c;GPIO初始化有个这个函数 void GPIO1Pin23PinMuxSetup(void) {HWREG(SOC_CONTROL_REGS CONTROL_CONF_GPMC_A(7)) CONTROL_CONF_MUXMODE(7); } 如果不熟悉可能看的一头雾水&#xff0c;这个含义是&#xff1a; 解释一下&#xff…

【Nginx】Nginx面试题

什么是Nginx&#xff1f; Nginx是一个 轻量级/高性能的反向代理Web服务器&#xff0c;用于 HTTP、HTTPS、SMTP、POP3 和 IMAP 协议。他实现非常高效的反向代理、负载平衡&#xff0c;他可以处理2-3万并发连接数&#xff0c;官方监测能支持5万并发&#xff0c;现在中国使用ngin…

U-boot常用命令(二)

FAT格式文件系统操作命令 有时候需要在uboot中对SD卡或EMMC中存储的文件进行操作&#xff0c;这时候就要用到文件操作命令。跟文件操作相关的命令有&#xff1a;fatinfo、fatls、fstype、fatload 和 fatwrite&#xff0c;但是这些文件操作命令只支持 FAT 格式的文件系统&#…

PCA(Principal Component Analysis,主成分分析)降维

1.PCA介绍 来源&#xff1a;视频https://www.bilibili.com/video/BV1E5411E71z/ 笔记&#xff1a;https://www.bilibili.com/read/cv23587690?spm_id_from333.999.0.0&jump_opus1 PCA就是找坐标系&#xff0c;使得数据在保留一维数据&#xff0c;损失是最小的。 目标&a…

Aescripts StyleX for AE(AI技术风格化插件)

Aescripts StyleX一款非常实用的视频风格和效果自动化处理插件&#xff0c;它提供了多种风格和效果、自动化处理、可自定义选项、支持多种分辨率、简单易用的界面和工具等功能&#xff0c;让用户可以轻松地为视频添加不同的风格和效果&#xff0c;并提高效率和准确性。StyleX 插…

基于STM32+RC522设计的门禁系统

一、项目背景 门禁系统是现代社会中非常重要的安全控制系统之一,其功能是在保障建筑物安全的同时,为合法用户提供便利。当前设计一种基于STM32+RC522的门禁系统设计方案,通过RFID-RC522模块实现了对用户卡的注册、识别及身份验证,通过控制SG90舵机实现门锁的开关,具有较高…

物联网架构和技术:如何实现物物互联和智能化控制

第一章&#xff1a;引言 物联网是一种新兴的技术领域&#xff0c;通过将物理设备、传感器和软件等连接起来&#xff0c;可以实现设备之间的互联互通&#xff0c;让各种设备可以进行数据交换和智能化控制。在这个数字化时代&#xff0c;物联网已经成为了连接万物的关键技术之一…

WiFi(Wireless Fidelity)基础(五)

目录 一、基本介绍&#xff08;Introduction&#xff09; 二、进化发展&#xff08;Evolution&#xff09; 三、PHY帧&#xff08;&#xff08;PHY Frame &#xff09; 四、MAC帧&#xff08;MAC Frame &#xff09; 五、协议&#xff08;Protocol&#xff09; 六、安全&#x…

程序设计入门——C语言 2023年5月9日

程序设计入门——C语言 一、基础理解1、什么是计算机&#xff1f;如何用计算机做事情&#xff1f;什么是应用软件&#xff1f;编程语言干啥的&#xff1f;计算机与人脑&#xff1f;学习编程能干啥&#xff1f;2、计算机-程序-算法3、解释语言vs编译语言 课程来源&#xff1a;链…

测试老鸟总结,性能测试常见瓶颈分析与调优,“我“也要卷出测试圈...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 性能测试过程中&a…

KingbaseES V8R3 集群运维系列 -- failover切换后集群自动恢复

​ 案例说明&#xff1a; KingbaseES V8R3集群默认在触发failover切换后&#xff0c;为保证数据安全&#xff0c;原主库需要通过人工介入后&#xff0c;恢复为新的备库加入到集群。在无人值守的现场环境&#xff0c;需要在触发failover切换后&#xff0c;主库可以自动恢复为新备…

jvm之图形化工具

写在前面 本文一起看下jvm图形化相关的工具&#xff0c;图形化的工具相比于命令行工具的好处是更加直观&#xff0c;也更容易分析问题。 1&#xff1a;jconsole 1.1&#xff1a;准备要连接的jvm进程 定义如下的类&#xff1b; package a.b; import java.util.concurrent.*…

Linux内核架构和工作原理

**前言&#xff1a;**作用是将应用层序的请求传递给硬件&#xff0c;并充当底层驱动程序&#xff0c;对系统中的各种设备和组件进行寻址。目前支持模块的动态装卸(裁剪)。Linux内核就是基于这个策略实现的。Linux进程1.采用层次结构&#xff0c;每个进程都依赖于一个父进程。内…

JavaScript模板引擎Template.js基本使用详解

template.js是一款JavaScript模板引擎&#xff0c;提供一套模板语法&#xff0c;简单好用&#xff0c;开发者可以写一个模板区块&#xff0c;每次传入的数据&#xff0c;生成对应数据产生的HTML片段&#xff0c;渲染不同的效果。官网&#xff1a;简洁语法版 https://github.com…

天猫数据分析:2023年Q1天猫净水器品牌销售TOP10排行榜

水质的好坏更是与人们的身体健康密切相关。随着社会经济的发展&#xff0c;居民生活水平提升&#xff0c;人们对饮用水质量、安全性的要求也不断提高&#xff0c;净水器也因此逐渐成为现代生活的必需品。 根据鲸参谋电商数据显示&#xff0c;2023年Q1在天猫平台上&#xff0c;净…

微服务#1 注册中心eareka和nacos

目录 注册中心: eureka 服务调用关系 eureka的作用 在Eureka架构中&#xff0c;微服务角色有两类 搭建EurekaServer服务, 服务注册和服务发现 Ribbon 负载均衡原理 ​编辑 负载均衡策略 饥饿加载 注册中心: nacos nacos服务搭建, 服务注册和发现 nacos服务集群属性 …

【shell脚本里的数组】

目录 一、数组的定义方法1、定义数组1.1、使用shell脚本来写出怎么查看这个数组有没有缺少元素1.2、使用shell脚本&#xff0c;来生成数组1.3、元素的切片 二、数组追加元素三、传输和传出1、向函数传入数组的值2、从函数返回数组 一、数组的定义方法 &#xff08; 20 10 60…