Unity InputSystem使用教程
前言:
????????本篇主要為大家講解InputSystem輸入系統(tǒng)的基礎(chǔ)使用方式以及各選項(xiàng)的功能。
????????如果您對(duì)老版輸入系統(tǒng)有過使用經(jīng)驗(yàn),那么上手將會(huì)非常的順暢。如果您是剛開始學(xué)習(xí)Unity的新同學(xué)也沒有關(guān)系,本篇會(huì)從基礎(chǔ)開始講述,每一個(gè)步驟都盡可能配有操作截圖和代碼,看完相信您也能輕松學(xué)會(huì)。
????????想要使用InputSystem,建議使用Unity 2019.x及以后的版本,因?yàn)?018版本的InputSystem還是一個(gè)preview版本。本著聽人勸吃飽飯的優(yōu)良傳統(tǒng),作者果斷選擇了新版本。

我這里采用的是Unity 2021版。
準(zhǔn)備工作
????????第一步我們需要安裝InputSystem。
????????在菜單欄中選擇“Window→Package Manager”在彈出的 Package Manager面板中選中“Input System”,單擊右下角的Install安裝,如果列表中顯示的內(nèi)容較少并找不到Input System時(shí),可以將窗口頂部的“Packages”切換為“Unity Registry”即可。

安裝后選擇“Yes”,會(huì)重啟Unity,重啟后安裝完畢。

安裝結(jié)束后,我們?cè)陧敳坎藛螜谶x擇“Edit→Project Settings”點(diǎn)擊“Player”我們可以看到Active Input Handling已經(jīng)切換為“Both”,
這個(gè)地方有三個(gè)選項(xiàng):
Input Manger(Old):只采用舊版的Input輸入,新版的Input System將不起作用。
Input System Package(New):只采用新版的Input System方式,舊版的Input將不再起作用。
Both:兩種方式同時(shí)起作用

我們選用“Input System Package(New)”或者“Both”都可以。
????????Input?System的使用方式大致分為兩種,一種是通過InputSysten Package提供的組件,在編輯器通過拖拽,選擇,掛載等方式,進(jìn)行函數(shù)與輸入動(dòng)作的綁定;另一種是使用代碼對(duì)函數(shù)與輸入動(dòng)作進(jìn)行綁定。
?????本文主要側(cè)重于在代碼中如何使用Input System,對(duì)于編輯器組件面板就適當(dāng)省略或者開一篇新文章專門講解。
常用功能對(duì)比
?????安裝完畢后我們來對(duì)比一下,新老版本的使用差別,下面提供一個(gè)官方的文檔連接,如果有需要可以查看https://docs.unity3d.com/Packages/com.unity.inputsystem@1.1/manual/Migration.html#unityengineinputanykeydownhttpsdocsunity3dcomscriptreferenceinput-anykeydownhtml
新舊版的鍵盤按鍵監(jiān)聽對(duì)比:
? ? 以監(jiān)聽"A"鍵按下,抬起,按住為例
????????舊版:Input.GetKeyDown(KeyCode.A);
???????????????????Input.GetKeyUp(KeyCode.A);
???????????????????Input.GetKey(KeyCode.A);
????????新版:Keyboard.current.aKey.wasPressedThisFrame;
???????????????????Keyboard.current.anyKey.wasReleasedThisFrame;
???????????????????Keyboard.current.anyKey.isPressed;

其余鍵盤按鍵與“A”并無差別,將“aKey”更換為“bKey”、“cKey”......即可
新舊版的鼠標(biāo)左鍵監(jiān)聽對(duì)比:
????舊版:Input.GetMouseButtonDown(0);
? ? ? ? ???????Input.GetMouseButtonUp(0);
? ? ? ? ???????Input.GetMouseButton(0);
????新版:Mouse.current.leftButton.wasPressedThisFrame;
? ? ? ? ????? ?Mouse.current.leftButton.wasReleasedThisFrame;
? ? ? ? ???????Mouse.current.leftButton.isPressed;

????????鼠標(biāo)中鍵、右鍵使用方法并無差別,將“l(fā)eftButton”更換為“middleButton”/“rightButton”。
這里的isPressed要稍微提一下,我們按住Ctrl點(diǎn)擊isPressed會(huì)發(fā)現(xiàn),按住的判斷是通過ReadValue()與一個(gè)默認(rèn)值pressPointOrDefault進(jìn)行對(duì)比返回的結(jié)果。所以也可以用
?Keyboard.current.aKey.ReadValue()>=N
自己指定一個(gè)數(shù)值N來進(jìn)行判斷,一般來說按下與抬起只會(huì)返回0/1,考慮到浮點(diǎn)數(shù)的精度問題,建議不要直接使用0或者1來進(jìn)行判斷,避免出現(xiàn)一些精度問題。關(guān)于這個(gè)地方我們?cè)诤筮匢nputActions部分還會(huì)做講解,這個(gè)地方就不再說了。

最后就是鼠標(biāo)位置和滾輪的數(shù)據(jù)獲取。
????鼠標(biāo)位置對(duì)比
????????舊版:Input.mousePosition;
????????新版:Mouse.current.position;
????滾輪對(duì)比
????????舊版:?Input.GetAxis("Mouse ScrollWheel");
????????新版:Mouse.current.scroll.ReadValue();
????滾輪這個(gè)地方要稍微注意一點(diǎn),舊版的會(huì)直接返回一個(gè)float的值,而新版本則會(huì)返回Vector2,如果想返回float請(qǐng)使用Mouse.current.scroll.ReadValue().y,值得注意的是,新版返回的Y值一般都較大,我這邊根據(jù)滾動(dòng)的速度不同大概都在0,120,240,360左右,希望各位有所了解。
更多的使用區(qū)別請(qǐng)參考一開始給出的官方文檔,這里就不再一一列舉了。
Input Actions
????Input Actions是新版輸入系統(tǒng)的重點(diǎn)!此處篇幅較長(zhǎng)并且與編輯器面板操作較多。
????新建Input Actions:
????????方法一:在Project面板下右鍵單擊,在彈出的菜單中找到“Input Actions”,修改新建“Input Actions”的名稱。

方法二:在頂部菜單欄選擇“Assets-Create-Input Actions”

選中新建的Input Actions,將"Generate C# Class"勾選,這樣可以為我們生成代碼,后續(xù)要是用,很重要。
其余三個(gè)選項(xiàng)
????C# Class File:生成的C#代碼存放位置。默認(rèn)與Input Actions同級(jí)
????C# Class Name:生成C#代碼的類名。默認(rèn)與Input Actions同名
????C# Class Namespace:生成代碼所處的命名空間。
修改完以后點(diǎn)擊Apply保存。

????雙擊新建的Input Actions或者在Inspector面板選擇Edit asset,打開Input?Actions編輯面板,在此面板我們可以創(chuàng)建一些自己的行為。

點(diǎn)擊Action Maps旁邊的“+”創(chuàng)建一個(gè)“行為映射表”,新建的Map下會(huì)帶有一個(gè)空action和一個(gè)未綁定Control的Binding。下邊會(huì)解釋。

現(xiàn)在我們細(xì)說一下上述步驟出現(xiàn)的幾個(gè)概念以及Input Actions配置界面的一些選項(xiàng)。
? ? ?InputAction Assets,輸入行為資產(chǎn),可以理解成自定義的輸入行為(動(dòng)作)的集合。一個(gè)輸入動(dòng)作可以由一種或者多種輸入信號(hào)組成。比如“前進(jìn)”這個(gè)動(dòng)作,可以被“W”鍵觸發(fā),也可以被“↑”方向鍵觸發(fā),甚至可以被手柄的“↑”鍵觸發(fā)。
? ? Action Map:行為映射表,一個(gè)Input Actions可以有多個(gè)Map。每個(gè)Map下面又有許多Action,可以批量控制Action啟用與禁用。比如有一個(gè)UI Map,他包含選項(xiàng)的上,下,左,右,確定等功能,我們將這些功能綁定在方向鍵。另一個(gè)Car?Map,他控制賽車的移動(dòng),綁定的同樣是方向鍵。為了避免功能沖突,我們可以再拉起UI面板的時(shí)候,整體禁用Car Map,關(guān)閉UI面的時(shí)候禁用UI Map,啟用Car Map。以及其他類似的操作。
? ? ?Input System將動(dòng)作分為三種類型
? ? ? ? ?Button:按鈕類型,相對(duì)簡(jiǎn)單只處理按下與抬起,并返回對(duì)應(yīng)數(shù)值,可以看做離散型非0? 即1。使用ReadValue<float>() 來獲取會(huì)獲得0/1。
? ? ? ? ?Value:值類型,與Button相比,它可以返回連續(xù)的數(shù)值,比如接入手柄以后,搖桿可以? ? 返回范圍內(nèi)的任何值。返回值的類型可以在Control Type中設(shè)置,下方會(huì)詳細(xì)說明。
? ? ? ? ?PassT hrough:直通類型,與Value幾乎一致,但是它可以返回所有設(shè)備的輸入,而Value只會(huì)返回當(dāng)前最優(yōu)先的設(shè)備輸入。

? ? ??Control Type:設(shè)置按鍵返回值的類型。之后會(huì)根據(jù)當(dāng)前選擇內(nèi)容篩選輸入設(shè)備。
? ? ? ? Any:任何值????????????????Axis:一維軸浮點(diǎn)數(shù)????????????????Bone:骨骼
? ? ?? ?Digital:數(shù)字???????????????? ?Dpad:手柄四向按鈕??????????????Eyes:VR相關(guān)數(shù)值
? ? ? ? Integer:整數(shù)? ? ? ? ? ? ? ? ?Quaternion:四元數(shù)???????????? ??Stick:搖桿
? ? ? ? Touch:觸控屏???????????????Vector2:二維向量???????????????? Vector3:三維向量
? ? ? ? Button:按鈕
??????Initial State Check:啟用?Action時(shí),Action綁定的Control可能已經(jīng)具有非默認(rèn)狀態(tài),系統(tǒng)依次檢查所有被綁定到此Action的Control,并立即響應(yīng)處于非默認(rèn)狀態(tài)下的控件。
? ? ? 補(bǔ)充:輸入系統(tǒng)將不同種類的輸入抽象為Control。Control表示輸入值的來源,例如,某個(gè)float值來源于鍵盤上的某個(gè)按鍵,某個(gè)Vector2值來源于鼠標(biāo)單幀的位移,某個(gè)Vector2值來源于手柄上的搖桿。
? ??參考自:https://blog.csdn.net/qq_39915907/article/details/125630907? 本文部分參考自這篇文章,后續(xù)將不再寫明,建議閱讀。
Interactions:交互方式,可以理解為這個(gè)動(dòng)作的觸發(fā)方式,比如:點(diǎn)擊,長(zhǎng)按,雙擊等。
? ? ? 所有的方式都會(huì)默認(rèn)有三個(gè)事件Started、Performed、Canceled。
? ? 舉一個(gè)明顯的例子,長(zhǎng)按(手指按住1秒以上認(rèn)為是長(zhǎng)按):在按下去的瞬間觸發(fā)Started,在任意時(shí)間松開觸發(fā)Canceled,如果連續(xù)按壓時(shí)間達(dá)到1秒觸發(fā)Performed。
Hold:長(zhǎng)按,需要保持按壓一段時(shí)間才算完成這個(gè)動(dòng)作。就像上方舉得例子。
????Press Point:表示一個(gè)臨界點(diǎn),只有過了這個(gè)值才算按下。如果Button則只有0和1。如果是搖桿類的按鈕,則需要推動(dòng)幅度大于PressPoint才行。
????Hold Time:長(zhǎng)按時(shí)間,按下時(shí)間達(dá)到Hold Time后會(huì)立刻觸發(fā)Performed。
????Default如果勾選則會(huì)采用Unity提供的默認(rèn)值,如果想要自定時(shí)間和臨界值,請(qǐng)取消勾選。????
????Open Input Settings:默認(rèn)值可以點(diǎn)擊Open Input Settings進(jìn)行查看并修改,也可以“Edit→Project Settings→Input System Package”打開查看并修改。這兩項(xiàng)后續(xù)不再講述。

Multi Tap:連擊,在規(guī)定時(shí)間間隔內(nèi)點(diǎn)擊指定的次數(shù)。
????Tap Count:連擊次數(shù)。
????Max Tap Spacing:兩次點(diǎn)擊之間的時(shí)間間隔。
????Max Tap Duration:單次點(diǎn)擊 按下與抬起之間的最大持續(xù)時(shí)間。
????只有每次點(diǎn)擊都滿足上述兩個(gè)條件,才會(huì)觸發(fā)Performed。

Press:類似按鈕,
????Press Only:在按下的時(shí)候觸發(fā)Started和 Performed,在抬起的時(shí)候觸發(fā)Canceled。????????? ? ? Release Only:在按下的時(shí)候Started,在抬起的時(shí)候觸發(fā)Canceled和Performed。
? ? Press And Release:在按下的時(shí)候觸發(fā)Started和?Performed,抬起的時(shí)候觸發(fā)Canceled和Performed。

Slow Tap:緩慢點(diǎn)擊,他與Hold的區(qū)別是,在達(dá)到最短按壓時(shí)間后不會(huì)立刻觸發(fā)Performed,而是在松開的瞬間觸發(fā)Performed。
????Min Tap Duration按壓的最短時(shí)間。

Tap:單擊。可以看做只點(diǎn)擊一次的Multi?Tap。選項(xiàng)在Multi?Tap中也有講述


Processors:輸入值處理,對(duì)返回的Value作出指定處理,如取反,限定范圍等等。這個(gè)地方會(huì)因?yàn)樯线呥x擇的Control Type不同從而導(dǎo)致出現(xiàn)的選項(xiàng)也不同。部分功能類似的選項(xiàng)就會(huì)合并講解。
Clamp:將輸入值限制在[min,max]之間,值類型為Float。

Invert:將輸入值取反(乘以-1)。應(yīng)用場(chǎng)景,如果某方向控制鍵,左輸入1右輸入-1,我們?nèi)粘5淖鴺?biāo)系都是左為負(fù)數(shù),右為正數(shù),為了符合習(xí)慣可以取反。
Invert Vector2:同上??梢詥为?dú)選擇取反哪個(gè)軸。

Invert Vector3:同上。略。
Normalize:如果最小值>=0,則將[min,max]范圍內(nèi)的輸入值規(guī)格化為無符號(hào)規(guī)格化形式[0,1],如果最小值<0,則將輸入值規(guī)格化為有符號(hào)規(guī)格化形式[-1,1]。

Normalize Vector2:將輸入值歸一化,模長(zhǎng)為1。比如使用搖桿控制人物移動(dòng)時(shí),我們往右前方移動(dòng),如果值為(1,1)那么就會(huì)比單純前進(jìn)(1,0)速度要快。這不是我們想要的,所以就要將輸入值的模長(zhǎng)限制為1。設(shè)置后可能會(huì)返回(0.71,0.71)其他角度類似。
Normalize Vector3:同上。
Scale:輸入值乘以Factor

Scale Vector2:將X軸與x相乘,Y軸與y相乘。

Scale Vector3:類似同上。
Stick Deadzone:搖桿死區(qū)處理。搖桿或者其他設(shè)備可能存在輕微誤觸或者其他原因造成的信號(hào)問題,在邊緣地區(qū)不準(zhǔn)確。比如將搖桿右滑到底切換下一頁,因?yàn)槟承┰蜉斎胫涤肋h(yuǎn)在0.99f等等情況。所以只要小于Min值的信號(hào)都將變?yōu)?,大于Max值的信號(hào)都將變?yōu)?。

Axis Deadzone:axis死區(qū)處理。絕對(duì)值小于最小值的任何值為 0,絕對(duì)值大于最大值的任何值為 1 或 -1。

選中當(dāng)前未綁定的<No Binding>,在右側(cè)面板會(huì)有Binding、Interactions、Processors三個(gè)選項(xiàng)。
????其中Interactions和Processor是針對(duì)當(dāng)前Binding的特別設(shè)置,與Action功能一致。如果此處未進(jìn)行設(shè)置,就使用上級(jí)的Interactions/Processor設(shè)置;如果進(jìn)行了設(shè)置,以此處Interactions/Processor的設(shè)置為準(zhǔn)。
????Binding是此處的核心,它的作用是用來對(duì)輸入信號(hào)進(jìn)行綁定。輸入系統(tǒng)將Action與Control之間的連接抽象為Binding。Binding包含一條指向Control的控件路徑,多個(gè)Binding可以指向同一個(gè)Control,一個(gè)Action可包含多個(gè)Binding。系統(tǒng)收到某個(gè)控件輸入的數(shù)據(jù)時(shí),會(huì)驅(qū)動(dòng)所有綁定了該控件的Action進(jìn)行響應(yīng)。

Binding綁定
在Action Maps欄單擊“+”新建Map后,雙擊新建的Map可以修改其名稱“Player”,在Actions欄雙擊新建的Action修改名稱“Jump”,選中<No Binding>,點(diǎn)擊右側(cè)的Path旁邊的下拉菜單。

比如我們想用鍵盤“空格”觸發(fā)跳躍,綁定的方法有三種:
方法1:選擇“Keyboard”-"By location of key"-"Space",即可綁定。

方法2:在搜索框中直接搜索目標(biāo)“Space”,點(diǎn)擊即可綁定

關(guān)于每個(gè)按鈕對(duì)應(yīng)的選項(xiàng)以及外接手柄的對(duì)應(yīng),我會(huì)在后續(xù)的"Input Debugger"中講述。
方法3(推薦):通過Listen綁定,點(diǎn)擊Listen后就會(huì)開始監(jiān)聽輸入,我們敲擊“空格”,就會(huì)現(xiàn)在是在面板中,只要點(diǎn)擊即可綁定。

這就是綁定的三種方法。
在實(shí)際情況中一個(gè)動(dòng)作可能會(huì)被多個(gè)按鍵觸發(fā),繼續(xù)用Jump舉例子,在部分小游戲中跳躍可以被“空格”,“↑”甚至數(shù)字區(qū)的“8”來觸發(fā),對(duì)于這種情況,InputSystem給我們提供了一個(gè)非常簡(jiǎn)單的解決辦法。
單機(jī)Jump旁邊的“+”,選擇“Add Binding”,會(huì)在Jump下添加一個(gè)新的Binding,我們只需要仿照上面的方法,挨個(gè)進(jìn)行綁定,就可以讓多個(gè)按鈕觸發(fā)同一個(gè)Action.


接下來我們來一起看看Action下的幾個(gè)綁定選項(xiàng)

Add Binding:普通的綁定,可以綁定一個(gè)信號(hào)。
Add Positive\Negative Binding:由兩個(gè)信號(hào)組成的綁定,返回一維向量。比如2d游戲中的左移/右移動(dòng)。

選中“Negative?”與“Positive”后續(xù)綁定方法與Binding一致,此處的幾個(gè)選項(xiàng)
Composite Type:沒有查到相關(guān)資料,如果選擇后兩項(xiàng)會(huì)變成“Add Binging With?One Modifier”和“Add Binding With Tow Modifiers”樣式,此處不再展開講解,如果有讀者了解可以在評(píng)論區(qū)幫忙完善,感謝。

Min Value:Negative 綁定鍵的值
Max Value:Positive 綁定鍵的值
Which Side Wins:當(dāng)同時(shí)按下兩個(gè)鍵的處理方式,Neither,兩個(gè)鍵都停止輸入,Negative 和Positive返回指定輸入值。

Add Up\Down\Left\Right Composite:返回二維數(shù)據(jù),由四個(gè)信號(hào)組成,可以用于WASD,↑↓←→等。綁定與Binding一樣。

Add?Up\Down\Left\Right\Forward\Backward?Composite:返回三維數(shù)據(jù),由六個(gè)信號(hào)組成,類似Unity的WASDQE,控制前后左右上下等。綁定與Binding一樣。

Add Binging With One Modifier:組合鍵,例如Ctrl+S,Ctrl+Z等
Add Binding With Tow Modifiers:組合鍵,例如組合鍵Ctrl+K+C,Ctrl+K+U等等

在使用組合鍵的時(shí)候,注意熱鍵沖突。類似“Alt+F4”這樣的組合鍵,只能說勸君慎重?。。?/p>
Input Debug
? Input Debug窗口是一個(gè)非常好用的東西,打開方式:
????“Window→Analysis→Input Debugger”


這個(gè)窗口中,所有可以被識(shí)別的輸入設(shè)備都會(huì)被顯示在這。之前我們?cè)诮壎ㄝ斎氚粹o的時(shí)候會(huì)不會(huì)有這么一個(gè)疑惑,我怎么知道這個(gè)按鈕對(duì)應(yīng)哪個(gè)信號(hào)。還有每個(gè)信號(hào)的輸入值類型又是什么樣子呢?
我們就以我的手柄為例,上圖中我已經(jīng)選中了手柄,雙擊,打開詳細(xì)界面。

我們可以看到設(shè)備的詳細(xì)信息。Name就是在Unity InputSystem中對(duì)應(yīng)的名稱;DisplayName是我手柄上的文字,B就對(duì)應(yīng)我手柄的B;后邊還有信號(hào)類型方便我們?cè)O(shè)置Type。此時(shí)按動(dòng)手柄還能通過value看到實(shí)時(shí)輸入值,并且屏幕下方還會(huì)實(shí)時(shí)打印,方便我們調(diào)試。爆贊!
比如我此時(shí)正在按B鍵,掰動(dòng)搖桿,所有的輸入信息都會(huì)在面板中展示出來,建議各位自己嘗試一下。


Input Actions配置界面的內(nèi)容大部分就已經(jīng)講完了還有一個(gè)ControlSchemes,這部分我們等到接入手柄以后再講解。下面我們正式在代碼中使用我們自定的Input Actions。
對(duì)我來說,使用代碼更加直觀,也更易于理解一點(diǎn)。
先來看一下我的Input Actions是長(zhǎng)什么樣子的。以免下面代碼中出現(xiàn)一些名字讓人產(chǎn)生疑惑。
我的InputActions我改名為“MyInputSystem”,他有一個(gè)Map名字是“Player”,下面有兩個(gè)行為“Jump”跳躍綁定的是鍵盤的空格鍵,“Movement”移動(dòng)綁定的是WASD。

點(diǎn)擊上方的"Save Asset",保存我們的設(shè)置,并且生成對(duì)應(yīng)的代碼。代碼保存路徑就在我們一開始提過的,如果遺忘,請(qǐng)向上翻找。

為了保持各位的閱讀連貫性,就不分上下篇。
直接二合一!

使用Input System,我們的腳本需要引用using UnityEngine.InputSystem

生成的代碼各位可以自行查看,這里就不詳講,要不然篇幅太長(zhǎng)了。
新建一個(gè)腳本。引入命名空間。
聲明自定義的InputActions并實(shí)例化,我這邊的類名是MyInputSystem。
注意:使用之前一定要執(zhí)行Enable();否則不起作用。每一個(gè)Map以及Action都可以單獨(dú)設(shè)置Enable和Disable;
現(xiàn)在輸入監(jiān)聽就已經(jīng)開啟了。

我們讓跳躍函數(shù)與Jump綁定。

綁定Movement


使用ReadValue<T>()來獲取數(shù)值,這個(gè)T盡可能與在面板中設(shè)置的Control Type保持一致,以免發(fā)生一些預(yù)料之外的錯(cuò)誤。
上面講過,每個(gè)Action默認(rèn)有started,performed,canceled事件。所以我們擴(kuò)展成以下形式。

您可以嘗試將自己的定義的Action與函數(shù)進(jìn)行綁定。這種寫法,會(huì)在監(jiān)聽到綁定的信號(hào)輸入時(shí)調(diào)用對(duì)應(yīng)事件。屬于按一下執(zhí)行一次,不會(huì)一直回調(diào)。
目前可能并不太能直觀的體現(xiàn)出三種事件的區(qū)別。
我們現(xiàn)在把Jump改一下,變成performed要蓄力1秒才會(huì)觸發(fā)。這樣大家就能看出來明顯的區(qū)別。修改完以后記得保存。

????????inputActions.Player.Jump.started += ctx=>Debug.Log("按下空格");
? ? ? ? inputActions.Player.Jump.performed += ctx => Debug.Log("蓄力完成");
? ? ? ? inputActions.Player.Jump.canceled += ctx => Debug.Log("松開空格");


38秒按下空格觸發(fā)started?,1秒(39秒)后觸發(fā)performed ,40秒抬起空格觸發(fā)canceled 。
可以看到,現(xiàn)在三個(gè)事件已經(jīng)出現(xiàn)了明顯的區(qū)別。
這個(gè)地方大家一定要自己多多實(shí)踐,與上半部分那些設(shè)置組合起來多多嘗試,才能更好的使用。我這篇文章也不能給大家把所有的組合全部展示出來,那樣也沒有意義。
接入手柄
? ? 在開發(fā)中,移動(dòng)并不是單純靠鍵盤輸入,可能還有靠手柄,現(xiàn)在很多手柄配有搖桿,輸入的值也并不是非0即1,這樣可以通過搖桿控制角色移動(dòng)的同時(shí)并控制速度。
????我們繼續(xù)在Movement下添加手柄搖桿。此處要將Mode改成Analog,否則還是會(huì)和按鍵一樣,只能返回0/1。下方的Processors進(jìn)行歸一化設(shè)置,上邊講過是為了限制模長(zhǎng)為1。

接入代碼看看最后的效果。
? ? private void Update()
? ? {
? ? ? ? //因?yàn)橐繋极@取數(shù)據(jù),所以需要在Update中
? ? ? ? if (inputActions.Player.Movement.IsPressed())
? ? ? ? {
? ? ? ? ? ? Debug.Log(inputActions.Player.Movement.ReadValue<Vector2>());
? ? ? ? }
? ? }


現(xiàn)在已經(jīng)可以看到,搖桿已經(jīng)被成功接入,并且可以獲取搖桿推動(dòng)的幅度。
手柄的其他按鍵與搖桿也可以通過類似的方法進(jìn)行設(shè)置。
補(bǔ)充——手柄震動(dòng)
????對(duì)于部分支持震動(dòng)的手柄來說,我們可以用代碼控制它震動(dòng)。方式獲取要震動(dòng)的手柄,設(shè)置最低震動(dòng)頻率與最高震動(dòng)頻率。上代碼!
注意,實(shí)際應(yīng)用時(shí)應(yīng)該增加一步判空檢查,避免報(bào)錯(cuò)。

? ? private void OnEnable()
? ? {
? ? ? ? //手柄可以直接指定當(dāng)前手柄,也可以通過InputAction.CallbackContext回調(diào)獲取
? ? ? ? //開啟震動(dòng).
? ? ? ? Gamepad.current.SetMotorSpeeds(0.2f, 0.5f);
? ? }
? ? private void OnDisable()
? ? {
? ? ? ? //結(jié)束震動(dòng)
? ? ? ? Gamepad.current.SetMotorSpeeds(0, 0);
? ? }

Control Scheme——控制方案
隨著我們接入手柄,我們現(xiàn)在已經(jīng)有了鍵盤,手柄兩套輸入,隨著以后項(xiàng)目的完善可能還會(huì)接入其他外設(shè),比如方向盤模擬器,某專用手柄等等。定義的行為也會(huì)越來越多,顯示的內(nèi)容可能會(huì)很多,Control?Scheme 可以幫我們更好的管理定義的行為,方便切換平臺(tái)等。

點(diǎn)擊左上角菜單 → AddControl?Scheme?

Add?Control?Scheme:添加一個(gè)方案。
Edit Control?Scheme??:編輯一個(gè)方案。
Duplicate Control?Scheme :復(fù)制一個(gè)方案。
Delete Control?Scheme :刪除一個(gè)方案。
Requirements: 列表中的每種類型設(shè)備可以選擇為Optional或Required
????????????????Optional: 可選的(官方未給出說明)
????????????????Required: 必要的(官方未給出說明)
這里我們新建一個(gè)“Player”和“Gamepad”

現(xiàn)在每一個(gè)binding都會(huì)出現(xiàn)選“Use in control Scheme”選項(xiàng)。勾選相應(yīng)的選項(xiàng)。
Control Schemes可以進(jìn)行過濾顯示,點(diǎn)擊上方選項(xiàng),選擇一個(gè)Control?Scheme或者All?Control?Schemes全部顯示。

點(diǎn)擊后邊的Device,可以通過Device進(jìn)行過濾顯示。

刪除Control Schemes的時(shí)候要注意,切換到自定義Schemes,選擇刪除后,?首先會(huì)詢問是否確定刪除。選擇確定后會(huì)彈出,是否刪除所有勾選為指定Schemes的Binding,以當(dāng)前為項(xiàng)目例,如果選擇“yes”,所有勾選"Player"的Binding都會(huì)被刪除,如果選擇“No”則Binding會(huì)被保留只刪除Control Schemes。


補(bǔ)充:使用inputSystem后,UI的EventSystem根據(jù)選擇模式不同可能會(huì)失效。使用UI前請(qǐng)點(diǎn)擊“Replace with InputSystemUIInputModule”。


????????到這里InputSystem的基礎(chǔ)使用方法基本就介紹完畢。
????????到這篇幅也已經(jīng)不短了再接著寫下去也不合適。 還有一些其他內(nèi)容在這里就不展開講解,比如Input System支持輸入記錄,多手柄等等,還有一些選項(xiàng)的具體使用方法,以及Player Input 的使用,編輯器上點(diǎn)擊配置一些函數(shù)的調(diào)用等等。
????????如果有較多的人想看或者需要這方面的演示,我可以專門出一期視頻來展示,那些內(nèi)容用文章的方式不是非常合適,也不直觀。

????????如果本文對(duì)您有所幫助,請(qǐng)支持一下作者。
求贊,求贊,求贊
我們下期再見