Unreal Engine4键位更换以及对应思考
来源:
52vr |
责任编辑:传说的落叶 |
发布时间: 2019-06-13 08:16 | 浏览量:
这篇文章介绍了如何在UE4中实现更换键位的方法。
介绍
在大多数的PC游戏中,为了适应大多数玩家,往往会提供键位设置的接口。虽然也有例如生化危机系列游戏提供的是几个输入类型供玩家自己选择,然而还是自定义输入的方法更加普遍。
需要注意的是,很多的PC游戏的输入控制都是即支持手柄,又支持键盘\鼠标操控的。但是往往要么只启用手柄操作,要么只启用键盘\鼠标操作。关于这一块的详细内容可以参考我以前的博客:游戏输入控制的五条黄金法则
前置问题
在了解虚幻4的键位更换功能之前,首先要思考一些问题,这些问题确定了之后,才能进一步的去实现键位的更换功能。
键位配置是否写入存档?持久化保存该如何进行?
UE4的键位配置是默认读取对应的Input.ini文件的,因此在进行键位配置的时候,比较通用的方法是写入对应的ini文件。但是如果键位配置写入存档就是另一套方法了,甚至不需要进行持久化的保存。
输入设备的切换该如何抉择?
参考我以前的博客:游戏输入控制的五条黄金法则
组合键?
UE4内置的组合键有ctrl,shift,cmd与alt,这些键可以与普通按键进行组合。在项目中是否需要进行这些组合键的应用?
Axis与Action的归一?
手柄的摇杆Axis通常对应着−1.0~1.0或者0.0~1.0的值,但是键鼠上的Action往往只有一个固定的值。例如游戏中的停~走~跑操作在手柄上往往是半推~全推摇杆实现的,但是放在键盘上则只有一个输入值(通常为最大值,也就是跑)。某些游戏中(RPG游戏居多)可能会预设一些固定的值用于切换走/跑切换,但是毕竟还是离散的值,与Axis有本质的区别。
是否允许一个键来映射多个操作?
例如允许将一个键用于多个操作?这样一来针对于Input Consumption需要有一系列的配置。
在上面这些问题都有了答案,或者说设计方案之后,键位更换的功能才好真正实现。
键位更换在UE4中的具体实现
其实……具体实现的方法并不太难,以ActionMapping的重新绑定为范例,代码如下:
[代码]:
01 |
UInputSettings* Settings = const_cast<uinputsettings*>(GetDefault<uinputsettings>()); |
02 |
TArray<finputactionkeymapping>& Axes = Settings->ActionMappings; |
03 |
04 |
for (auto& Mapping : Axes) |
05 |
{ |
06 |
// 筛选对应的action mapping |
07 |
if (Mapping.ActionName == MappingName && Mapping.bAlt == Alt && Mapping.bCmd == Cmd && Mapping.bCtrl == Ctrl && Mapping.bShift == Shift && Mapping.Key == Key) |
08 |
{ |
09 |
auto actionMap = Mapping; |
10 |
actionMap.ActionName = NewData.MappingName; |
11 |
actionMap.bAlt = NewData.Alt; |
12 |
actionMap.bCmd = NewData.Cmd; |
13 |
actionMap.bCtrl = NewData.Ctrl; |
14 |
actionMap.bShift = NewData.Shift; |
15 |
actionMap.Key = NewData.Key; |
16 |
17 |
// 重构KeyMap |
18 |
for (TObjectIterator<uplayerinput> It; It; ++It) |
19 |
{ |
20 |
// 之所以这么做是希望更改之后立刻生效 |
21 |
It->RemoveActionMapping(Mapping); |
22 |
It->AddActionMapping(actionMap); |
23 |
It->ForceRebuildingKeyMaps(); |
24 |
} |
25 |
// 在这里更改Mapping的值,从而将其持久化存储 |
26 |
Mapping.ActionName = NewData.MappingName; |
27 |
Mapping.bAlt = NewData.Alt; |
28 |
Mapping.bCmd = NewData.Cmd; |
29 |
Mapping.bCtrl = NewData.Ctrl; |
30 |
Mapping.bShift = NewData.Shift; |
31 |
Mapping.Key = NewData.Key; |
32 |
33 |
// 持久化储存 |
34 |
Settings->SaveKeyMappings(); |
35 |
} |
36 |
}</uplayerinput></finputactionkeymapping></uinputsettings></uinputsettings*> |
各种东西似乎都……在注释中写好了,看代码就行……
需要注意的问题
有一个踩过的坑,需要注意一下。
当初为了避免过多的Cast导致性能的消耗,我们将PlayerController的实例进行了静态存储,但是最终发现好像……会导致乱七八糟的问题……
相关文章
网友评论
全部评论:0条
推荐
热门