Unity新輸入方案InputSystem介紹-序

寫在前面
????其實個人想寫介紹InputSystem的文章已經(jīng)很久,一直找不到好的切入點(diǎn)。首先一點(diǎn),我覺得介紹類的文章,不會照翻英文文檔。目前InputSystem在Github更新頻率已經(jīng)和ScriptableRenderPipeline有得一拼了,官方已經(jīng)連文檔都來不及更了。反正到了正式版發(fā)布,Unity中國也會出大量的翻譯文檔和教程,到時候入門也不會太遲。我知道B站文章不能復(fù)制鏈接,但還是先留下Github地址:
https://github.com/Unity-Technologies/InputSystem
計劃以及大綱
????包括本篇,大概會出3~4篇,外加一個外傳性質(zhì)的文章:
序:吐槽一下UnityEngine.Input這個小老弟;
InputSystem的設(shè)備管理:先不著急動手,了解新輸入系統(tǒng)的設(shè)備管理;
InputSystem的事件系統(tǒng):本系列的壓軸,會介紹新的輸入工作流,即InputAction;
第三方設(shè)備接入InputSystem*:(可選),這個是專門寫給第三方硬件小廠,不用太多Unity知識,把設(shè)備SDK接入Unity的InputSystem。但是可能需求量不大,而且手頭邊沒有合適的設(shè)備,有可能會棄掉。
外傳-怎么省事地開發(fā)多平臺VR:之前有個網(wǎng)友問過我,多個VR平臺移植問題,我索性寫一個文章介紹;
怎么回事兒,UnityEngine.Input
????Input作為Unity初學(xué)者早期接觸的API,和有些開發(fā)平臺的輸入事件回調(diào)不一樣,是采用主動查詢的調(diào)用方式,比如Input.GetXXXX(),Input.GetXXXXDown(),Input.GetXXXXUp()。除了可以直接代碼訪問鍵盤,鼠標(biāo),觸屏以及各種傳感器的輸入信息外,還提供InputManager自定義搖桿和按鍵。設(shè)置好InputManager后,你就可以用對應(yīng)的String參數(shù)去訪問Input.GetAxis()和Input.GetButtonXX()等函數(shù)。

????但是,只要開發(fā)Unity久了,你會發(fā)現(xiàn)各種各樣的問題。由于InputManager的設(shè)置對于編程而言,簡直就是黑盒子的存在。少寫或錯寫一個字母,或者導(dǎo)入新插件,卻忘了導(dǎo)入輸入設(shè)置,導(dǎo)致Input報錯也是家常便飯。另外,批量編輯也不方便,除非你和我一樣是敢文本編輯InputManager.asset的猛男。老實說對手柄設(shè)備挺不友好,怎么能知道手柄按鍵對于哪個Axis,有時候換了另外一個手柄,甚至Axis排序也變了。而且你在移動平臺使用了虛擬搖桿和虛擬按鍵,Input就開始摸魚了。
????這些雞毛蒜皮倒是可以靠插件解決,還能忍受。但是VR來了,輸入設(shè)備一下子炸了。各個廠家都推出了自己設(shè)備的Unity SDK,而且各個SDK代碼風(fēng)格迥異。只是熟悉SDK的使用方式還好,但是一旦要移植到其他平臺,那基本就是推翻重新再來。光是一個訪問扳機(jī)的輸入值,就有可能有四種以上的寫法。
????經(jīng)過幾次洗禮,目前大廠的VR SDK其實不多了,Oculus系、SteamVR系、GoogleVR系(好像快要涼涼了,但是我很喜歡谷歌的代碼)、PSVR系(沒條件碰到)等等。畢竟廠家還是花了大價錢做了底層整合,Input小老弟兩只眼睛炯炯有神,于是交出了這份答卷:

????雖然之后在Packages有提供工具包,去幫你把這些設(shè)置添加到InputManager,但是由于不友好而且模糊不清的使用方式,大部分人會用乖乖用回廠家SDK,自己或者第三方封裝這些SDK,比較有名的整合方案,如VRTK。Unity不僅多了XR這個命名空間,還多了TrackedPoseDriver,還是扶不起Input,任開發(fā)者和各種SDK打架。怎么回事兒,小老弟?
Unity做了哪些嘗試
????在Unity 5新推出的StandardAssets,其中有一個CrossPlatformInput包,負(fù)責(zé)封裝了PC和移動端的輸入,貌似給了Input一些喘息機(jī)會。但StandardAssets更像給人做快速開發(fā),不一會兒CrossPlatformInput也淡出視線。
????不光是開發(fā)者,Unity老早了解Input局限性,不管是好用到炸的官方Package,還是那些一個比一個優(yōu)秀的官方范例工程,都是不斷地對Input封裝一層。但事情總要解決,2016年,Unity在論壇公布一個新輸入的原型,也就是后來的InputSystem。
https://blogs.unity3d.com/2016/04/12/developing-the-new-input-system-together-with-you/
????你可能會覺得只要靠第三方插件,就能解決這些問題。但是,除了輸入SDK外,各種優(yōu)秀插件的輸入方案不一定相同。讓開發(fā)者重復(fù)做輸入兼容這件事,已經(jīng)背離引擎的設(shè)計初衷。這些事情本來也必須是官方才能解決的,讓我們看看摸魚的Input還能活多久。
那么,InputSystem能用了嗎?
????答案是嘗鮮可以,做項目慎用。官方目前還在爆肝修各種BUG,有可能一個小版本,API都會有大改動。比如我有個一次更新后,以前配置好的輸入資源就GG失效了。甚至有一次通宵查Bug,發(fā)現(xiàn)是文檔太久沒更新,寫錯了。

????總之,Unity的Preview功能,不是讓你當(dāng)小白鼠,一直摸不到頭腦。而是預(yù)先了解新功能,然后一點(diǎn)一點(diǎn)修正開發(fā)的思維方式。等到正式版發(fā)布后,才能快速上手。想當(dāng)年我只能在概念上吹吹ECS,最近預(yù)覽Tiny后,發(fā)現(xiàn)已經(jīng)和一般Unity編程差不多。這些文章寫完后,可能就會閉關(guān)玩Tiny了。