Unreal Engine4鍵位更換以及對應(yīng)思考
來源:
52vr |
責(zé)任編輯:傳說的落葉 |
發(fā)布時間: 2019-06-13 08:16 | 瀏覽量:
這篇文章介紹了如何在UE4中實(shí)現(xiàn)更換鍵位的方法。
介紹
在大多數(shù)的PC游戲中,為了適應(yīng)大多數(shù)玩家,往往會提供鍵位設(shè)置的接口。雖然也有例如生化危機(jī)系列游戲提供的是幾個輸入類型供玩家自己選擇,然而還是自定義輸入的方法更加普遍。
需要注意的是,很多的PC游戲的輸入控制都是即支持手柄,又支持鍵盤\鼠標(biāo)操控的。但是往往要么只啟用手柄操作,要么只啟用鍵盤\鼠標(biāo)操作。關(guān)于這一塊的詳細(xì)內(nèi)容可以參考我以前的博客:游戲輸入控制的五條黃金法則
前置問題
在了解虛幻4的鍵位更換功能之前,首先要思考一些問題,這些問題確定了之后,才能進(jìn)一步的去實(shí)現(xiàn)鍵位的更換功能。
鍵位配置是否寫入存檔?持久化保存該如何進(jìn)行?
UE4的鍵位配置是默認(rèn)讀取對應(yīng)的Input.ini文件的,因此在進(jìn)行鍵位配置的時候,比較通用的方法是寫入對應(yīng)的ini文件。但是如果鍵位配置寫入存檔就是另一套方法了,甚至不需要進(jìn)行持久化的保存。
輸入設(shè)備的切換該如何抉擇?
參考我以前的博客:游戲輸入控制的五條黃金法則
組合鍵?
UE4內(nèi)置的組合鍵有ctrl,shift,cmd與alt,這些鍵可以與普通按鍵進(jìn)行組合。在項(xiàng)目中是否需要進(jìn)行這些組合鍵的應(yīng)用?
Axis與Action的歸一?
手柄的搖桿Axis通常對應(yīng)著−1.0~1.0或者0.0~1.0的值,但是鍵鼠上的Action往往只有一個固定的值。例如游戲中的停~走~跑操作在手柄上往往是半推~全推搖桿實(shí)現(xiàn)的,但是放在鍵盤上則只有一個輸入值(通常為最大值,也就是跑)。某些游戲中(RPG游戲居多)可能會預(yù)設(shè)一些固定的值用于切換走/跑切換,但是畢竟還是離散的值,與Axis有本質(zhì)的區(qū)別。
是否允許一個鍵來映射多個操作?
例如允許將一個鍵用于多個操作?這樣一來針對于Input Consumption需要有一系列的配置。
在上面這些問題都有了答案,或者說設(shè)計(jì)方案之后,鍵位更換的功能才好真正實(shí)現(xiàn)。
鍵位更換在UE4中的具體實(shí)現(xiàn)
其實(shí)……具體實(shí)現(xiàn)的方法并不太難,以ActionMapping的重新綁定為范例,代碼如下:
[代碼]:
01 |
UInputSettings* Settings = const_cast<uinputsettings*>(GetDefault<uinputsettings>()); |
02 |
TArray<finputactionkeymapping>& Axes = Settings->ActionMappings; |
03 |
04 |
for (auto& Mapping : Axes) |
05 |
{ |
06 |
// 篩選對應(yīng)的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 |
// 重構(gòu)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*> |
各種東西似乎都……在注釋中寫好了,看代碼就行……
需要注意的問題
有一個踩過的坑,需要注意一下。
當(dāng)初為了避免過多的Cast導(dǎo)致性能的消耗,我們將PlayerController的實(shí)例進(jìn)行了靜態(tài)存儲,但是最終發(fā)現(xiàn)好像……會導(dǎo)致亂七八糟的問題……
-
分享到:
相關(guān)文章
網(wǎng)友評論
您需要登錄后才可以發(fā)帖 登錄 | 立即注冊
關(guān)閉
- 用戶名:
- 密 碼:
- 驗(yàn)證碼: 看不清? 點(diǎn)擊更換
- 忘記密碼?
全部評論:0條
推薦
熱門