? 最新影片內容视频网站!,顶级欧美色妇xxxxx,精品一区二区在线视频观看
聯(lián)系我們

給我們留言

聯(lián)系我們

地址:福建省晉江市青陽街道洪山路國際工業(yè)設(shè)計(jì)園納金網(wǎng)

郵箱:info@narkii.com

電話:0595-82682267

(周一到周五, 周六周日休息)

當(dāng)前位置:主頁 > 3D教程 > 圖文教程

Unreal Engine4鍵位更換以及對應(yīng)思考

來源: 52vr | 責(zé)任編輯:傳說的落葉 | 發(fā)布時間: 2019-06-13 08:16 | 瀏覽量:

Unreal Engine 4 —— 鍵位更換以及對應(yīng)思考

 
這篇文章介紹了如何在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)閉

全部評論:0條

推薦
熱門