Unity新輸入方案InputSystem介紹-(二)

一、為什么重點講InputAction?
????其實Unity有不少預(yù)覽包,總是會出現(xiàn)一種功能,有多種調(diào)用方式。InputSystem的官方例子(在InputSystem/Assets/Demo/SimpleDemo/文件夾下),也列舉幾種檢測輸入的例子。有一定代碼能力的小伙伴,基本沒什么壓力。除了上一篇的直接查詢設(shè)備狀態(tài)外,個人覺得最突出的還是基于InputAction的全新輸入事件系統(tǒng)。不僅提供全新的InputActionAsset,而且整個方案中,大部分可供開發(fā)者編輯的要素還是InputAction。


二、怎么編輯InputAction?
????讓我們打開一個InputActionAsset文件,如Packages/com.unity.inputsystem/InputSystem/Plugins/PlayerInput/DefaultInputActions.inputactions。這里會接觸幾個新名詞,如InputActionMap(InputAction的集合)、InputControlScheme(用于篩選InputControl)、InputBinding(用于綁定InputAction和InputControl)等。

????①管理InputControlScheme和用InputControlScheme篩選InputControl;
????②篩選輸入設(shè)備;
????③InputActionMap的編輯列表;
????④選中的InputActionMap對應(yīng)的InputAction編輯列表;
????⑤選中的InputAction或InputBinding的編輯界面;
????現(xiàn)在應(yīng)該可以了解整套InputActionAsset的作用:保存多個InputActionMap(不同使用場景),InputActionMap用于檢索InputAction(具體的行為),InputAction用于表示該行為由什么InputControl(輸入源)觸發(fā),InputBinding作為InputAction和InputControl連接的橋梁,InputControlScheme用于篩選InputControl。
????目前我發(fā)現(xiàn)代碼引用InputAction的方式有三種:
????1.聲明InputAction字段,然后在Inspector面板上編輯;
????2.聲明InputActionReference字段,然后選擇InputActionAsset文件的子資源InputActionReference;

????3.直接代碼創(chuàng)建InputAction,也是之前說的強大的字符串反序列化功能;
public InputAction(string name = null, string binding = null, string interactions = null, string processors = null, string expectedControlLayout = null);
????第一種和第二種比較適合開發(fā)者編輯,而且無論是你在代碼聲明InputAction,還是在InputActionAsset→InputActionMap新建一個InputAction,操作都是一樣的。
????1.選擇InputAction,按下+按鍵,選擇你要添加的綁定類型(簡單、一軸混合,二軸混合):

????2.選擇新建的InputBinding,在Binding→Path選擇想要偵聽的InputControl:

????3.在Interactions添加InputAction觸發(fā)模式,然后編輯Interaction(可選):


????4.在Processors添加InputAction返回值的修飾操作,然后編輯Processor(可選):


????5.最后得到一個關(guān)于開火的InputAction,同時一個InputBinding可以有零個或多個Interaction和Processor。想增加更多InputBinding,重復(fù)1~4步驟即可:


三、怎么使用InputAction?
????我們已經(jīng)可以自己創(chuàng)建和獲取InputAction了,那么具體怎么用呢?其實InputAction有三個事件回調(diào)步驟,分別為started(開始)、performed(執(zhí)行)、canceled(取消),需要查閱文檔來了解不同Interaction的回調(diào)情況。我這邊以剛才編輯的InputAction為例:
????1.新建一個MonoBehaviour腳本,獲取InputAction,可以是從InputActionAsset查閱獲取,直接引用,或手動創(chuàng)建;
????2.在Start函數(shù)注冊回調(diào)事件,并啟用InputAction:
void Start(){
????//...
????if(inputAction!=null){
????????inputAction.performed+=OnPerformed;
????????inputAction.Enable();
????}
}
? ? 3.在Destroy函數(shù)反注冊回調(diào)函數(shù),并禁用InputAction:
void OnDestory(){
????//...
????if(inputAction!=null){
????????inputAction.performed-=OnPerformed;
????????inputAction.Disable();
????}
}
????4.在回調(diào)函數(shù)處理Input事件:
void OnPerformed(InputAction.CallbackContext ctx){
????if(ctx.ReadValue<float>()<0.25f) {
????????print("Fire is Released!!!");
????}else {
????????print("Fire is Pressed!!!");
????}
}
????5.回到Unity編輯器,點擊Play,看看是否運行成功:

????可能有人注意到了,光是一個InputAction需要做的工作有點麻煩,使用多個InputAction不就累死。還記得上一篇說到的InputActionAsset的自動生成C#類,就是幫你生成一個幫助類。它幫你注冊和反注冊的工作都做了,而且還聲明一個接口,讓你實現(xiàn)對不同InputAction的處理。



四、一些題外話
????由于本人上一家公司的主業(yè)還是研發(fā)XR設(shè)備的,所以本系列文章有點XR設(shè)備怎么怎么著。如果Unity在2015年就推出InputSystem的正式版,我想我那家公司的SDK的開發(fā)人員會減少一半以上,而且我也能少受罪。其實我連UE4的輸入SDK都搞過,但整體的開發(fā)體驗不是很好。SteamVR雖說是一個很好VR設(shè)備兼容方案,但是它不支持安卓端(如一體機)。而Unity的InputSystem簡直不能再好用了,原生庫上封裝一個Layout,完事。
????目前XR設(shè)備研發(fā),還是處于低潮期,所以我可能不會講第三方硬件接入InputSystem。而且如果有熟讀C#能力的話,其實就是照著葫蘆畫瓢?,F(xiàn)在大部分大廠都已經(jīng)在渲染端和Unity完成整合(之后可以用LWRP),而廠家的SDK都是提供一些輸入接口和工具庫。等InputSystem推出正式版,除了一些特殊功能外,那基本沒有廠家的SDK什么事了。
????但是不管XR發(fā)展如何,我覺得還是要把一些積累的開發(fā)經(jīng)驗分享出來。畢竟如果一聲不吭就跑去賣炒面,那么有愧于那些還在XR開發(fā)中打滾的老鐵們。雖然到了現(xiàn)在還是想吐槽老東家,但畢竟也受到其不少照顧,做人要厚道。雖然因為正式版未發(fā)表(還有我懶),只講了皮毛,但希望這些文章能給那些被輸入SDK折磨的Unity開發(fā)者一些幫助。下一篇就是外傳,分享如何開發(fā)多平臺VR的經(jīng)驗了。YouSing,我們走(喂~感覺哪里不對勁)。