yang131

导航

关于使用自定义按键的探索和实现

目前游戏中大都支持自定义按键,在设置页面中,为了给玩家一个舒适或者更有空间的操作方式,我对在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的置为空即可,防止重复。

 

posted on 2024-07-15 19:29  NoNight  阅读(66)  评论(0编辑  收藏  举报