? ,,

新锐科创官网-专业室内外高精度人员定位系统厂家及服务商

聯(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條

推薦
熱門
主站蜘蛛池模板: 最近免费mv在线观看动漫 | 久久久久久自慰出白浆 | 日韩一区二区三区四区不卡 | 日韩精品无码中文字幕电影 | 四虎爱爱 | 五月婷综合 | 中日韩高清无专码区2021 | 太粗太深了太紧太爽了动态图男男 | 私色综合网| 中国孕妇变态孕交xxxx | 日韩成人无码 | 黄大色黄美女精品大毛片 | 国产精品午夜性视频网站 | 午夜色大片 | 成人毛片在线 | 午夜福利伦伦电影理论片在线观看 | a级片在线 | 微拍秒拍99福利精品小视频 | 中文字幕一区二区精品区 | 久久av无码精品人妻系列 | 欧美做a欧美 | 久久这里都是精品 | 欧美日韩久久 | 视色视频在线观看 | 国产成人一区二区三区精品久久 | 精品视频h | 国产乱码精品一区二区三区四川人 | 亚洲二区在线 | 天天做天天爱天天一爽一毛片 | 国产a一级毛片午夜剧场14 | 免费一级a毛片在线播放视 免费一级e一片在线播放 | 亚洲综合伦理一区 | 18末成年禁止进入免费观看 | 欧美午夜理伦三级在线观看 | 国产目拍亚洲精品一区麻豆 | av蓝导航精品导航 | 久久久久高潮综合影院 | bt天堂新版中文在线地址 | 伊人久久中文大香线蕉综合 | 日韩欧美在线播放 | 99久久久精品 |