InputSystem打造项目输入系统---Tab键控制状态面板和ControlType简介

本篇文章,我们将继续完善输入系统,同时也是在项目过程中不断熟悉InputSystem。

后续的文章,我们也会逐渐在完善项目、模块的过程中,逐渐深入InputSystem的学习。而非枯燥的讲述知识点或是简单的翻译文档。今天,也将实现几个小功能,同时推进InputSystem的学习。

一、实现Tab键控制状态面板的弹出和隐藏

在上一篇文章中,我们介绍了InputSystem如何解决按键冲突。

其中使用了InputSystem中动作的performed委托,来添加响应事件。

图片

而InputSystem中,每个动作不止有performed委托,还有started委托和canceled委托。

灵活组合这三个委托的使用,是完善输入系统的必要知识点之一。

三者的区别可以理解为按键的3个阶段:按下按键的瞬间,started委托会调佣;紧接着performed委托会被调用;当松开按键的时候,canceled委托会被调用。

那么我们可以利用started和canceled委托,实现在Tab键按下时,弹出状态面板。在Tab键松开时,隐藏状态面板。思路很简单,那么下面就开始演示实际代码。

首先,我们创建一个状态面板。内容随意,毕竟我们是为了做输入系统,UI大家自己发挥就好。

图片

将其制作为prefab放在Resources目录下,方便我们以代码的形式进行资源的加载。(记得制作完prefab之后,删除掉场景中的StatusWindow)

图片

在代码脚本的Start函数中,添加资源加载和对象初始化代码:

图片

代码的第15-16行完成了对象的初始化,17行将状态窗口隐藏。否则的话,状态窗口就会变成一开始就显示出来,这不是我们想要的效果。我们需要在Tab键按下才显示,Tab键松开就隐藏。

完成了UI部分的工作,接下来我们开始修改InputSystem的部分。首先添加Tab的按键动作和按键绑定:

图片

started委托,会在Tab键按下时响应,显示statusWindow;canceled委托,会在Tab键松开时响应,隐藏statusWindow。

运行代码,我们就实现了通过Tab键动态显示/隐藏状态面板的功能。

如果在运行代码时,出现类似这样的错误:

图片

这是因为我们切换了新版InputSystem造成的,而截图中的组件使用的仍然是默认输入系统。我们只要点击Replace with InputSystemUIInputModule按钮即可修复bug。

二、Action的配置细节

1、Action Type

前面,我们熟悉了整体的动作表使用、代码调用,以及在此基础上的基础功能实现。但是如果要实现更复杂的功能,我们在此之前,要熟悉InputSystem的更多基础细节。我们点击一下Action中的任意一个Action,比如点击一下“Move”,右侧就会出现Aciton的一些属性:

图片

我们可以看到Action Type中有3种选择,其中Button类型,顾名思义就是只能绑定按键类型。当触发按键时,就会调用对应事件。

主要差别在Value和Pass Through,这两种类型在响应按钮的时候,可以传递float类型。因此,二者可以用于摇杆控制移动的场景,可以实现摇杆幅度越大移动速度越快。不过两者的主要差别在于:Value类型,当有多个输入设备同时控制时,只会选取其中一个最佳的来响应;而Pass Through则会响应所有设备。

2、Initial State Check

我们可以注意到选择Value的时候,没有Initial State Check的选项:

图片

而Button和Pass Through则都有Initial State Check的选项:

图片

图片

当这个选项被勾选的时候,会进行初始化检查。也就是在动作表enable的时候,会检查按键是否已经被按下。如果已经被按下,则会直接响应该事件的委托。

而如果没有勾选,若此时按键已经被按下,也不会响应该事件的委托。必须先将按键松开,再按下,该事件的委托才会响应。

而Value没有这个选项,是因为Value默认是勾选这个选项的。Button和Pass Through默认不勾选。

3、Control Type

我们选择Value或者Pass Through类型是,会出现Control Type选项。Control Type代表的是响应事件之后,向委托函数传递的参数的类型:

图片

类型虽然很多,但是大部分我们通常情况下用不到。我们只要掌握其中一些的用法,其他的可以在用到时,类比推理即可。我们以最常用的Vector为例,将Move的Control Type选择为Vector2类型。随后给Move添加一组Up/Down/Left/Right绑定,如图所示:

图片

随后分别给Up/Down/Left/Right添加对应的W/A/S/D按键绑定。这样我们在按下W/A/S/D时,就会触发Move事件,并能够获取Vector2的值。不过在代码中,我们就需要对之前的Move的委托绑定的代码,进行修改。先给Move的performed委托重新添加一个函数:

图片

对应的OnMove函数如下:

图片

可以看到委托传入参数是一个CallBackContext上下文,我们通过这个context获取到我们的Vector2,然后打印日志。运行代码,按下W/A/S/D得到如下日志:

图片

可以看到,输出Vector2的内容是(x, y)坐标。按下w时,x坐标为0,y坐标为1。其他按键,输出类似。这样,我们就能通过W/A/S/D获取移动的方向了。

·END·

扫描二维码

⬇️

添加助教老师

⬇️

免费领取游戏策划4天训练营!

⬇️

  • 15
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值