最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

Unity InputSystem使用教程

2023-04-09 16:56 作者:叁拾柒渡伍  | 我要投稿

前言:

????????本篇主要為大家講解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 2018.4.36版本截圖

我這里采用的是Unity 2021版。

準(zhǔn)備工作

????????第一步我們需要安裝InputSystem。

????????在菜單欄中選擇“Window→Package Manager”在彈出的 Package Manager面板中選中“Input System”,單擊右下角的Install安裝,如果列表中顯示的內(nèi)容較少并找不到Input System時(shí),可以將窗口頂部的“Packages”切換為“Unity Registry”即可。

Package Manager安裝展示圖

安裝后選擇“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í)起作用

InputSystem起作用的設(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;

新舊版本對(duì)比


其余鍵盤按鍵與“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;

新舊版對(duì)比

????????鼠標(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è)地方就不再說了。

isPressed

最后就是鼠標(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”的名稱。

新建 Input Actions

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

新建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 Action設(shè)置

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


Input Actions配置界面

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

新建Action Maps

現(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ù)不再講述。

Hold

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。

Multi Tap

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。

Press

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

????Min Tap Duration按壓的最短時(shí)間。

Slow Tap

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

Tap


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

Clamp:將輸入值限制在[min,max]之間,值類型為Float。

Clamp

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

Invert Vector2:同上??梢詥为?dú)選擇取反哪個(gè)軸。

Invert Vector2

Invert Vector3:同上。略。

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

Normalize

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

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

Scale Vector2

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)?。

Stick Deadzone

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

選中當(dāng)前未綁定的<No Binding>,在右側(cè)面板會(huì)有BindingInteractions、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",即可綁定。

方法1

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

方法2

關(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)擊即可綁定。

方法3

這就是綁定的三種方法。

在實(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.

添加新Binding

綁定后

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

Add Binding:普通的綁定,可以綁定一個(gè)信號(hào)。

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

Add Positive\Negative Binding

選中“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ū)幫忙完善,感謝。

Composite Type

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 Composite

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

Add Up\Down\Left\Right\Forward\Backward Composite

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”

打開方法
Input Debug窗口

這個(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ì)在面板中展示出來,建議各位自己嘗試一下。

實(shí)時(shí)輸入展示

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綁定。

綁定Jump

綁定Movement

綁定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ū)別。修改完以后記得保存。

修改Jump

????????inputActions.Player.Jump.started += ctx=>Debug.Log("按下空格");

? ? ? ? inputActions.Player.Jump.performed += ctx => Debug.Log("蓄力完成");

? ? ? ? inputActions.Player.Jump.canceled += ctx => Debug.Log("松開空格");

修改代碼
結(jié)果

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。

手柄設(shè)置

接入代碼看看最后的效果。

? ? private void Update()

? ? {

? ? ? ? //因?yàn)橐繋极@取數(shù)據(jù),所以需要在Update中

? ? ? ? if (inputActions.Player.Movement.IsPressed())

? ? ? ? {

? ? ? ? ? ? Debug.Log(inputActions.Player.Movement.ReadValue<Vector2>());

? ? ? ? }

? ? }

代碼
結(jié)果

現(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)等。


創(chuàng)建

點(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全部顯示。

Control Schemes過濾顯示

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

Device過濾顯示

刪除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”。

點(diǎn)擊前

點(diǎn)擊后

????????到這里InputSystem的基礎(chǔ)使用方法基本就介紹完畢。

????????到這篇幅也已經(jīng)不短了再接著寫下去也不合適。 還有一些其他內(nèi)容在這里就不展開講解,比如Input System支持輸入記錄,多手柄等等,還有一些選項(xiàng)的具體使用方法,以及Player Input 的使用,編輯器上點(diǎn)擊配置一些函數(shù)的調(diào)用等等。

????????如果有較多的人想看或者需要這方面的演示,我可以專門出一期視頻來展示,那些內(nèi)容用文章的方式不是非常合適,也不直觀。


????????如果本文對(duì)您有所幫助,請(qǐng)支持一下作者。

求贊,求贊,求贊

我們下期再見


Unity InputSystem使用教程的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國家法律
无锡市| 海原县| 陈巴尔虎旗| 兴文县| 怀远县| 磴口县| 仙居县| 通辽市| 福鼎市| 萝北县| 太保市| 米林县| 五寨县| 陆丰市| 遵义市| 柏乡县| 石嘴山市| 林州市| 原阳县| 简阳市| 会宁县| 衡阳市| 滕州市| 昭苏县| 兴山县| 佛山市| 漳州市| 吴川市| 新密市| 肇庆市| 桂东县| 郎溪县| 永泰县| 阜康市| 湘阴县| 光泽县| 司法| 峨眉山市| 安平县| 遂昌县| 阜平县|