Unity Input System 新输入系统的功能及用法介绍

Posted ZeryChen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity Input System 新输入系统的功能及用法介绍相关的知识,希望对你有一定的参考价值。

声明:

        1. 本文介绍了Unity引擎的插件Input System使用方法,参考版本为1.4.1

        2. 本文参考的官方文档:

                Input System 使用方法

                Input System 脚本API

Input System 功能和用法介绍

. 安装

工具栏菜单: Window > Package Manager

Package Manager > 搜索 > Input System → 点击安装

安装后弹出警告窗口

警告:Input System与Unity原生输入系统不兼容

是:启用Input System,禁用原生输入系统

否:不启用Input System 

 

工具栏菜单: Edit > Project Settings 

Project Settings > Player > Other Settings > Configuration > Active Input Handling* → 启用/禁用Input System

. 概念

新输入系统的使用可以归纳为两个步骤:

        (1). 创建行为资产 (Input Action Assets),绑定输入控件

        (2). 编写自定义脚本,定义用于响应输入事件的回调函数

1. Control(控件)

        输入系统将不同种类的输入抽象为Control。Control表示输入值的来源,例如,某个float值来源于键盘上的某个按键,某个Vector2值来源于鼠标单帧的位移,某个Vector2值来源于手柄上的摇杆。

        控件路径:输入系统使用控件路径查找Control,一个Control的可以由一条控件路径唯一表示。

        路径语法如下:

component/component...

写法类似于文件的系统路径。每个路径由一个或多个由正斜杠分隔的组件组成

        组件语法如下:

<layoutName>usageNamecontrolName#(displayName)

组件多个字段构成,每个字段都是可选的,但必须至少存在一个字段。所有字段都不区分大小写。

        字段的用途如下:

字段

描述

举例

<layoutName>

设备级别的名称

<Keyboard>/space

controlName

控件级别的名称

<Keyboard>/a

usageName

用于设备层(第一层):要求设备具有给定用途
用于控件层(第二层):要求设备中的控件具有给定用途

用于设备层:<XRController>LeftHand/trigger
用于控件层:<Gamepad>/Submit

#(displayName)

要求设备或控件具有给定的显示名称

<Keyboard>/#(a)

        可以使用*代替某个字段,表示任何设备或控件

2. Action(行为)

输入系统将针对一系列输入的响应策略抽象为Action(行为)。Action是输入系统的核心,系统通过设计Action将物理(系统如何感知设备传来的输入信号)与逻辑(系统收到信号后如何响应)进行解耦。开发者在编写响应代码时,不需要考虑如何监听设备,只需要与Action进行对接即可。

        阶段事件:

        Action为开发者提供了5种事件,开发者需要自定义回调函数,以委托的形式监听这些事件。当Action绑定的Control收到输入信号时,Action会触发事件交互事件(Started, Performed, Canceled),当Action被启用或禁用时,也会触发相应事件(Waiting, Disabled)。

        阶段事件的触发时机如下:

阶段

描述

Disabled

Action被禁用,拒绝进行交互

Waiting

Action被激活,等待进行交互

Started

交互开始

Performed

交互完成

Canceled

交互结束(完成后)或取消(完成前)

3. Binding(绑定)

输入系统将Action与Control之间的连接抽象为Binding。Binding包含一条指向Control的控件路径,多个Binding可以指向同一个Control,一个Action可包含多个Binding。系统收到某个控件输入的数据时,会驱动所有绑定了该控件的Action进行响应。

4. Input Action Assets(行为资产)

行为资产是包含Action及其关联的Binding和控制方案的文件。文件的扩展名为 .inputactions ,以纯 JSON 格式存储。输入系统中行为资产与实现代码是相互独立的,行为资产仅作为存储绑定信息的容器,实现代码被放置在UnityEngine.InputSystem命名空间下,开发者需要使用PlayerInput组件或自己编写脚本来使用自己的行为资产。

5. 编写回调函数

        Control的状态值以回调函数参数的形式传递给逻辑,参数的数据类型取决于Control的类型,如按钮的状态值数据类型为float(按钮感应按压的模拟信号值),手柄摇杆的状态值数据类型为Vector2(向量的方向表示摇杆的方向)。对于事件驱动的响应,状态值可以在回调函数中InputAction.CallbackContext类型的参数中获取,对于消息驱动的响应,状态值可以在回调函数中InputValue类型的参数中获取。

. 创建Input Action Assets(行为资产)

        行为资产一般通过Input Actions编辑器创建,也可以通过脚本直接创建,本文仅介绍编辑器的使用方法。

1. 打开Input Actions编辑器

Project菜单: Create > Input Actions → 双击Input Actions资产打开Input Actions编辑器

编辑器的操作界面如下

2. Control Scheme(控制方案)

功能:

(1).控制方案指定输入系统要监听哪些外部设备的信号,系统仅关注这些设备传来的信号。

(2).单个资产可以添加多个控制方案,允许开发者根据不同类型的设备对Binding集合进行批量启用或禁用。例如,角色的移动射击瞄准可以通过键鼠来操控,也可以通过手柄来操控,但一名玩家同时只能选择其中一种方案来操控角色,如果系统既监听键鼠信号又监听手柄信号,会造成CPU资源的浪费,开发者可将键鼠相关Binding纳入键鼠控制方案,手柄相关Binding纳入手柄控制方案,游戏运行时,只选择一种控制方案,激活当前控制方案的Binding,禁用其余控制方案的Binding。

(3).方便开发者修改资产。选择一种控制方案后,界面将仅显示与此控制方案相关的Binding。

用法:

(1).Control Schemes的管理

        点击左上角菜单 → (Add|Edit|Duplicate|Delete) Control Scheme 

        添加|编辑|复制|删除 一个设备

        Control Schemes弹窗如下

        Requirements: 列表中的每种类型设备可以选择为Optional或Required

                Optional: 可选的(官方未给出说明)

                Required: 必要的(官方未给出说明)

(2).Control Schemes的过滤显示

        点击工具栏第一个菜单项

                → 选择一种Control Scheme

                        Actions窗口将仅显示与该Control Schemes相关的Binding

                → 选择All Control Schemes

                        Actions窗口将显示全部Binding

        点击工具栏第二个菜单项

                → 选择一种Device

                        Actions窗口将仅显示与该Control Schemes相关且设备为Device的Binding

                → 选择All Devices

                        Actions窗口将仅显示与该Control Schemes相关的所有Binding

3. Action Map(行为映射)

功能:

单个资产可以添加多个Action Map,允许开发者根据当前使用情景对Action集合进行批量启用或禁用。例如,键盘中的方向键在游戏情景中用于控制角色移动,在UI情景中用于切换当前选中的UI控件,如果两个使用情景不同Action依赖于同一个Control,会造成逻辑混乱,开发者可以将游戏情景下的Action纳入游戏Action Map,将UI情景下的Action纳入UI Action Map,根据不同的情景,激活某个Action Map,禁用其余Action Map。

用法:

点击子视图右上角的加号即可

4. Action(行为)

功能:

管理多个Binding与Composite,关联多个Control,为开发者自定义回调函数提供监听的事件。

用法:

(1). Action Type

        交互事件的触发时机与Action类型的关系,以及其他细节如下:

Action Type

Value()

Button(按钮)

Pass-Through(直通)

Started

控件状态值离开默认值时触发

按钮被按下,按压值离开0时触发

仅在Action被启用时触发

Performed

控件状态值改变时触发

按钮被按住,按压值达到阈值时触发

控件状态值改变时触发

Canceled

控件状态值回到默认值时触发

按钮被松开,
如果按压值已达到阈值,按压值落回阈值内时触发
如果按压值未达到阈值,按压值回到0时触发

仅在Action被禁用时触发

控件消歧

×

初始状态检查

×

按压值:处于[0,1]的float型模拟信号,用于感应按钮是否被按压,按压值达到按压阈值时,按钮才能视为被按下

控件消歧:如果Action绑定了多个Control,选择近期被响应最频繁的控件作为主Control,此Action触发的回调函数将带有来自该Control的参数。

初始状态检查:启用 Action时,Action绑定的Control可能已经具有非默认状态,系统依次检查所有被绑定到此ActionControl,并立即响应处于非默认状态下的控件。

(2). Control Type

        限制在界面设置绑定时显示的Control类别,限制哪些Control可以与其绑定的Action进行交互

Control Type

描述

Axis

一维浮点轴

Button

按钮

Key

键盘按键

Vector2

二维向量

Vector3

三维向量

Quaternion

四元数

Integer

整数

Stick

摇杆

Dpad

手柄四向按钮

Touch

触摸屏

5. Binding(绑定)

功能:

管理一个指向Control的控件路径

用法:

Path:控件路径

Use in control scheme:当前Binding在哪些控制框架中生效

6. Composite(组合绑定)

功能:

多个Control同时驱动以模仿一个不同类型的Control。Composite包含多个Binding,这些被绑定Control的状态值会组合在一起成为一个新状态值传递给逻辑。

用法:

(1). Composite Type

Composite Type

新状态值的数据类型

描述

1D Axis (一维轴)

float

由两个按钮Control组成一维轴,分别代表正负

2D Vector (二维向量)

Vector2

由四个按钮Control组成二维向量,分别代表上下左右

3D Vector (三维向量)

Vector3

由六个按钮Control组成三维向量,分别代表上下左右前后

One Modifier(单修饰器)

取决于Control的类型

按住一个按钮Control后,被修饰Control才能被Action响应

Two Modifier(双修饰器)

取决于Control的类型

按住两个按钮Control后,被修饰Control才能被Action响应

Button With One Modifier

float

One Modifier,被修饰Control是按钮控件

Button With Two Modifier

float

Two Modifier,被修饰Control是按钮控件

Composite下的子Binding可以设置不同的组合类型

1D Axis,2D Vector,3D VectorBinding指向的Control在Composite中扮演的角色及其表示含义:

Composite Part

1D Axis

2D Vector

3D Vector

Negative

-1

Positive

1

Up

(0,1)(+Y)

(0,1,0)(+Y)

Down

(0,-1)(-Y)

(0,-1,0)(-Y)

Left

(-1,0)(-X)

(-1,0,0)(-X)

Right

(1,0)(X)

(1,0,0)(X)

Forward

(0,0,1)(+Z)

Backward

(0,0,2)(+Z)

1D Axis的附加属性:

1D Axis的属性

描述

Which Side Wins

同时驱动表示正负的两个Control时,如何处理

Min Value

1D Axis 最小值,默认-1

Max Value

1D Axis 最大值,默认1

Which Side Wins

描述

Neither

返回 0

Positive

返回 Max Value

Negative

返回 Min Value

2D Vector3D Vector的附加属性:

Mode选项

描述

Analog(模拟控制)

将按钮Control的按压值原样进行组合

Digital(数字控制)

根据按钮是否被按下转化为01再进行组合

Digital Normalized(归一化数字控制)

Digital,组合后的向量会被归一化

7. Interactions(交互策略)

功能:

交互策略表示Control状态值触发Action交互事件的某种方案。为BindingAction添加多种交互策略,添加到Action的交互策略会作用到Action下所有Binding上。如果Binding没有设置交互策略,则根据Action的类型使用默认的交互策略。

用法:

Press Point(按压阈值)

设置此值会覆盖系统默认的按压阈值,仅对当前Binding或Action生效。控件的按压值达到按压阈值时,按钮才能视为被按下。

(1). Press(按下)

按钮的交互策略,比按钮类型Action的默认交互策略变化更加灵活。

交互事件的触发时机与Press类型的关系:

Trigger Behavior

Press Only

Release Only

Press And Release

Started

按压值离开0时触发

Performed

按压值达到阈值时触发

按压值已达到阈值,而后落回阈值内时触发

达到阈值和落回阈值内都会触发

Canceled

如果按压值已达到阈值,按压值落回阈值内时触发
如果按压值未达到阈值,按压值回到0时触发

按压值回到0时触发

(2). Hold(按住)

需要使用者按住控件持续Hold Time秒来完成交互。

Hold Time:从按钮被按下(按压值达到阈值)开始计时,持续Hold Time秒后即可完成交互。

交互事件的触发时机如下:

Callbacks

Started

按压值达到阈值时触发

Performed

按压值达到阈值持续Hold Time秒后触发

Canceled

按压值达到阈值后,落回阈值内时触发

(3). Tap(敲击)

需要使用者按下控件后在Max Tap Duration秒内释放来完成交互

Max Tap Duration:按钮被按下(按压值达到阈值)到按钮被松开(按压值落回阈值内)的时间必须<Max Tap Duration才能满足交互条件。

交互事件的触发时机如下:

Callbacks

Started

按压值达到阈值时触发

Performed

按压值达到阈值后,在Max Tap Duration秒内落回阈值内时触发

Canceled

按压值达到阈值持续Max Tap Duration秒后触发

(4). Slow Tap(缓慢敲击)

需要使用者按下控件持续Min Tap Duration秒后释放来完成交互

Min Tap Duration:按钮被按下(按压值达到阈值)到按钮被松开(按压值落回阈值内)的时间必须≥Min Tap Duration才能满足交互条件。

交互事件的触发时机如下:

Callbacks

Started

按压值达到阈值时触发

Performed

按压值达到阈值持续Min Tap Duration秒后,落回阈值内时触发

Canceled

按压值达到阈值后,在Min Tap Duration秒内落回阈值内时触发

(5). Multi Tap(连续敲击)

需要使用者连续按下并释放控件Tap Count次来完成交互,按下控件后必须在Max Tap Duration秒内释放,上一次释放控件到下一次按下控件的间隔时间不能超过Max Tap Spacing秒。

Tap Count:连续敲击的次数

Max Tap Spacing:上一个Tap结束,即按钮被松开(按压值落回阈值内),到下一个Tap开始,即按钮被按下(按压值达到阈值)的时间必须<Max Tap Spacing,否则交互失败

Max Tap Duration:按钮被按下(按压值达到阈值)到按钮被松开(按压值落回阈值内)的时间必须<Max Tap Duration,否则交互失败。

交互事件的触发时机如下:

Callbacks

Started

按压值达到阈值时触发

Performed

当前交互未触发Canceled,按压值第Tap Count次落回阈值内时触发

Canceled

当前交互未触发过Performed
按压值达到阈值持续Max Tap Duration秒后时触发
按压值落回阈值内持续Max Tap Spacing秒后触发

8. Processors(处理策略)

功能:

处理策略表示Control状态值的一些数值处理方法,处理后的结果作为Action回调函数的参数供开发者访问。添加在BindingAction上,添加到Action处理策略会作用到Action下所有Binding上。如果Binding没有设置处理策略,则不作任何处理,直接使用Control的状态值作为回调函数的参数。

用法:

处理策略的详细信息如下:

处理类型

参数类型

附加属性

描述

Clamp

float

MinMax

将输入值钳制在[MinMax]范围内

Inve

Unity实现动作游戏的技能系统(Ability System)设计原型

前言

尝试写一个技能系统,希望其尽量完善。目前能想到的元素包括控制、模型、动画、音效、特效、碰撞检测、事件响应、伤害判断、Buff控制。集所有元素为一个编辑器,方便策划和美术进行操作。

输入控制

使用Input System作为跨平台接收输入响应,然后整合到Character脚本中,然后由CharacterOnCharacterEvent事件节点,监听对应的操作。
在这里插入图片描述

public void AddActionStarted(string actionName,Action<InputAction.CallbackContext> callback)
{
   GetInputAction(actionName).started += callback;
}
public void AddActionPerformed(string actionName, Action<InputAction.CallbackContext> callback)
{
   GetInputAction(actionName).performed += callback;
}
public void AddActionCanceled(string actionName, Action<InputAction.CallbackContext> callback)
{
   GetInputAction(actionName).canceled += callback;
}


private InputAction GetInputAction(string actionName)
{
   var action = _inputCharacterGamePlay.FindAction(actionName, throwIfNotFound: true);
   return action;
}

技能编辑

使用Timeline作为一个整合工具,可以添加动画特效音效物体控制扩展脚本集成为一个技能,并可以在Scene中随时进行预览。具体操作可以参考官方教程。
在这里插入图片描述
扩展了一个PlayableAsset作为Combo触发条件,为连击动画的衔接尽量合理而规定了一定的触发范围。

角色编辑器

在编辑了多个技能后,肯定需要一个角色编辑器来统筹所有的技能。规范技能播放的规则,进行碰撞检测等一系列操作,打通角色的操作的逻辑。
这里的Character是通过继承ScriptableObject实现的,方便保存角色的系列信息,并扩展了一个CharacterEditor,用来编辑保存角色的一些属性、技能、以及控制逻辑。
在这里插入图片描述

技能触发

在角色编辑器中创建OnCharacterEvent节点,然后创建一个Skill节点,连接即可触发技能播放。事件支持Input System触发,直接输入Input Action的名称,就可以获取当前的输入返回的参数。
在这里插入图片描述

若当前技能需要技能效果,则利用Timeline创建多个技能,通过OnCombo进行连击即可触发,下面多连击动作的展示。
在这里插入图片描述

  1. 连击A
    在这里插入图片描述
  2. 连击AA
    在这里插入图片描述
  3. 连击AAA
    在这里插入图片描述

基础动画

除了技能动画以外, 还有一些IdleWalkJump等常规动画。本来想沿用技能实现使用Timeline一套的解决方案,但是总感觉有点不搭。这里还是使用了默认的Animator让几个基础动画的切换感觉更合理一些。
在这里插入图片描述
输入在Input System中添加movementInput Action使用Vector2作为返回值, 键盘WASD、xbox的摇杆、以及移动端的虚拟摇杆都可以映射为一个Vector2的值,方便进行角色的控制。
在这里插入图片描述
基础动画的展示
在这里插入图片描述

碰撞检测

这里我主要在角色的大刀上绑定了一个碰撞盒子,并结合Timeline在技能施放动画的一定区间范围内开启碰撞盒子,方便让攻击的碰撞更为合理。并且在编辑器里面添加了一个创建测试的敌人的快捷按钮Create Enemy
在这里插入图片描述
在检测的碰撞的同时,可以获取当前角色正在施放的技能信息。即可对敌人进行,伤害判定,播放受击动画,以及添加BUFF或者DEBUFF。
因为连击技能也是一个个单独的技能,每个连击动作都有自己的单独属性,都可以根据不同的连击动画,给敌人造成更高的伤害。
在这里插入图片描述
敌人受击展示
在这里插入图片描述

BUFF系统

Buff主要是一个以计时器驱动的角色属性持续修改的状态。它本身包括的东西很多,除了就能修改角色自带的那一部分属性,还可以对角色进行一些其他操作,比如无敌击飞击退沉默恐惧嘲讽禁锢等等。
在这里插入图片描述
因为Buff的重复使用率非常高,这里会建立一个Buff池,在角色收到一个技能攻击的时候,会从Buff Pool中取出一个Buff并对其进行初始化,然后遍历当前角色的所有Buff,并根据Buff的基本信息,确定其中的优先级,然后执行对应的逻辑。在计时结束的时候,会回收给Buff池。
Buff持续存在的时间段中,角色的实时属性,有基础属性+Buff的各种因子综合而来。

未完待续

根据具体的需求,一个技能系统的复杂程度远不止于此。当前很多东西,还没设计完善,都还是针对点的说明,后续持续修改更新。
这篇博客在这里也算抛砖引玉了。

以上是关于Unity Input System 新输入系统的功能及用法介绍的主要内容,如果未能解决你的问题,请参考以下文章

Unity新版输入系统 new input system

新的输入系统不再触发任何东西

在新的 Unity 输入系统中如何映射到 KeyCode.JoystickButton0?

unity input system 使用记录(实例版)

如何使用新的输入系统在 Unity 中查找鼠标位置

Unity实现动作游戏的技能系统(Ability System)设计原型

(c)2006-2024 SYSTEM All Rights Reserved IT常识