关于使用自定义按键的探索和实现
目前游戏中大都支持自定义按键,在设置页面中,为了给玩家一个舒适或者更有空间的操作方式,我对在ue4中自定义按键输入的实现进行探索,当然ue4和ue5版本差别不大可以说大同小异。
对于自定义按键,比如玩家开枪,跳跃翻滚,本来使用q ,w e,来完成,但是我们在设置中可以改变他的按键,所以初步实现需要一个功能,那就是检测按键按下的函数,UE封装过于笨重,但是我们可以知道
key的事件处理是在PlayerController中完成的,也就是说,我们找到PlayerController,找到这个函数就可以,不想界面那边有现成的,PlayerController没有直接提供,需要从c++层面进行修改,
怎么修改呢,找到他的定义能发现一个函数:
virutal bool InputKey(FKey Key, EInputEvent EventType, float AmountDepressed, bool bGamepad);
这个函数对他重写一下,然后声明两个函数OnKeyDown和OnKeyUp,具体如下:
UFUNCTION(BlueprintImplementableEvent) void OnKeyDown(FKey Key); void OnKeyDown_Implementable(FKey Key); UFUNCTION(BlueprintImplementableEvent) void OnKeyUp(FKey Key); void OnKeyUp_Implementable(FKey Key);
至于上面的InputKey如何重写呢,代码如下:
if (!Key.IsMouseButton() ) { if (EventType == IE_Pressed) { OnKeyDown(Key); } else { OnKeyUp(Key); } } return Super::InputKey(Key,EventType,AmountDepressed,bGamepad);
然后编译,在虚幻编辑器中,新建一个结构体 ST EventTable,有Key和EventName
第一个是按键,第二个是事件所对应的值,可以是字符串或者枚举
然后我们在PlayerController中建立一个该类型的数组,
然后再OnKeyDown和OnKeyUp中遍历该数值,找到对应的Key所对应的Event,然后进行处理。蓝图代码如下:
CallEvent中分别处理对应的事件,如果是枚举类型,那么直接switch来对应,如果是字符串,那么要比较: 比如EventAction等于Jump,然后我们调用Jump函数,如果EventAction是翻滚,那么调用翻滚函数。
功能还需要支持设置界面中的Key更换,原理简单,找到对应的EventName,改Key,数组中有该Key的置为空即可,防止重复。