本篇文章,我们将继续完善输入系统,同时也是在项目过程中不断熟悉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天训练营!
⬇️