InputSystem打造项目输入系统——组合键
Press Point是给摇杆之类设备用的,这里的0.5代表着当我们的操纵感移动0.5的距离时,就可以触发这个Hold动作,所对应的事件。这会导致我们测试的时候,游戏中无法响应我们的ctrl+1的组合键。这就是默认的Button类型的按键响应事件,如果是非Button类型的动作事件,把Interaction选择为Press,则会强制认为是Button类型。在Action的属性中,除了我们先前介绍的
一、前言
在上一篇InputSystem系列的文章中,我们仔细讲解了InputSystem中Action Property的相关知识点。并且完成了一个小功能:使用Tab键控制状态面板的弹出。
同时,我们也简单介绍了一下Action属性中,Control Type的简单使用。
接下来,我们将继续介绍Control Type中的其它细节。文中,也将继续结合实例应用,来加深小伙伴对知识点的记忆和理解。
二、组合键
我们所有的动作事件的触发都是单个按键的。
但是在很多游戏场景中我们都会用到一些组合键,例如RTS游戏中会用到的编队功能。
通常是按下ctrl + 1编队,再按数字键1选择队伍。
接下来,我们将演示使用InputSystem实现组合键的功能。在实现这个功能之前,我们需要先修改我们的动作表,具体修改如下:
我们添加ChooseTeam动作,绑定数字键1,作为选择队伍的动作。然后添加了一个SetTeam动作,作为编队动作。而SetTeam的按键绑定,我们的目标是绑定ctrl + 1。点击SetTeam右侧的加号,选择Add Binding With One Modifier:
Add Binding With One Modifier提供了一个按键组合键,可以实现ctrl + 1这一类的组合键功能。而Add Binding With Two Modifiers选项,可以绑定两个组合键,即可以实现ctrl + shift + 1这样的双组合键。这里我们讲解一个组合键的使用,两个组合键的使用方式同理,小伙伴们可以自己实现。
点击完Add Binding With One Modifier,我们可以看到出现这样的内容:
这里的Modifier,通常就是我们的组合键。一般都是类似Ctrl、Shift、Alt这几个按键。
而Binding就是我们的常规按键。我们给Modifier绑定Shift键,给Binding选择数字键1:
这里不绑定Ctrl+1,是由于在unity中,ctrl+1本身也是快捷键。这会导致我们测试的时候,游戏中无法响应我们的ctrl+1的组合键。因此我们测试的时候,用shift+1进行测试。
点击Save Asset后,我们回到代码中。给ChooseTeam和SetTeam分别绑定委托响应函数:
OnChooseTeam和OnSetTeam的代码,依然是简单的输出日志。具体的逻辑实现,小伙伴们可以根据自己的项目需求修改。这里只是为了演示InputSystem的功能:
我们运行代码,分别按下1和shift+1,可以看到日志输出如下:
按照我们的预期,OnChooseTeam和OnSetTeam应该分别输出一次。这里OnChooseTeam却输出了两次,原因是当我们按下shift+1的时候,不止会激活对应的OnSetTeam。由于按下组合键shift+1时,数字键1也被按下了,所以也激活了OnChooseTeam的动作。
因此我们要解决一下这个问题,解决方式也比较简单。我们只要在shift按下时,设置一个标志位,来记录shift的状态即可。而在按下数字键1 的时候,读取这个状态就行:
IsShiftPressed用来记录shift键的状态。不过这里只是读取,而我们还需要对IsShiftPressed进行修改。我们可以利用之前学到的,添加一个ShiftState动作用于记录shift的状态:
在started事件时给IsShiftPressed赋值为true,在canceled事件时给IsShiftPressed赋值false。就完成了IsShiftPressed状态的修改与记录:
随后我们运行游戏,分别按下shift+1和数字键1,可以看到输出日志如下:
这样,我们就完成了我们想要的效果。
三、Interactions
在Action的属性中,除了我们先前介绍的Control Type,我们再来介绍一下Interactions的内容。
Interactions是用来处理按键交互、触发事件的方式的。通常来说有这几种:
Hold:长按按键到达一定时间,才会触发动作事件。
Multi Tap:在一定事件内,连续按下并松开一定次数,才会触发动作事件。
Press:一次正常按键,能够触发动作事件。这就是默认的Button类型的按键响应事件,如果是非Button类型的动作事件,把Interaction选择为Press,则会强制认为是Button类型。
Slow Tap:按下之后超过最短事件,但没有超过最长时间,才会触发动作事件。
Tap:按下之后在指定时间内松开,才会触发动作事件。
我们给Interactions添加Hold交互规则:
我们可以看到,hold交互规则中有两个参数,一个是Press Point,一个是Hold Time。Press Point是给摇杆之类设备用的,这里的0.5代表着当我们的操纵感移动0.5的距离时,就可以触发这个Hold动作,所对应的事件。这样子,就不局限于键盘按键了。Hold Time就是我们按住某个键的最短时间,这里Hold Time为0.4,代表着我们要按住一个键0.4秒才会触发这个相应的动作。我们为了演示的清晰,把Hold Time修改为2秒。运行游戏,就可以看到,按住j键2秒后,才输出日志:
四、总结
通过这个系列4篇文章,我们基本上把输入系统的常用知识点,都举例说明了一遍,已经足以应付大部分实际项目。
小伙伴们可以根据自己的需求,去实现不同的系统功能。如寻常的奔跑跳跃、移动交互,到技能释放、蓄力攻击,再到更高阶的手搓技能。小伙伴们都可以大胆的去尝试和实现了。
·END·
扫描二维码
⬇️
添加助教老师
⬇️
免费领取游戏策划4天训练营!
⬇️
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)