一種流水線形式的角色控制器實現(xiàn)思路
靈感以及參考來自視頻:

這種方法最直觀的好處就像視頻標(biāo)題所說的那樣:奪取玩家的控制權(quán),甚至可以讓AI來接管控制器進(jìn)行操作。
Unity初學(xué)者一枚,歡迎各位大佬討論,如有錯誤還請見諒。

實現(xiàn)思路及代碼示例:
首先,就像視頻中所說的那樣,將角色的控制器與用戶輸入分開,分別獨立為PlayerController與InputSystem,通過一個新的實例InputProvider將用戶的輸入傳遞給PlayerController。
在InputSystem與PlayerController中間可以有多個其它的系統(tǒng)用來對輸入結(jié)果進(jìn)行修改,或者接管輸入,這樣便組成了一個流水線。
如果要做到這點,那么很明顯,InputProvider中就需要包括InputSystem中的各項輸入?yún)?shù),就像這樣:


在得到輸入后,如果可以進(jìn)行跳躍,我們需要對事件進(jìn)行廣播,因此我們還需要一個廣播事件的方法TriggerEvent,在所有系統(tǒng)都處理完成后進(jìn)行調(diào)用。

在此基礎(chǔ)上,為了讓InputSystem等其余流水線上的系統(tǒng)能夠修改InputState中的參數(shù),我們還需要GetState方法,以及修改完成后將其返回給InputProvider中的SetState方法:


為了方便InputProvider在整個流水線中的調(diào)用,我的思路是將其設(shè)置為單例。
完整的InputProvider如下:

接下來以InputSystem為例,我們來看看流水線上的各個系統(tǒng)需要什么內(nèi)容。
首先既然要修改InputProvider中的參數(shù),我們當(dāng)然需要一個InputProcess方法對其進(jìn)行處理;并且,每個流水線上的系統(tǒng)都需要這樣做,我們可以寫一個接口,讓流水線上的系統(tǒng)來實現(xiàn)它。

因此,完整的輸入系統(tǒng)應(yīng)該是這個樣子:

同理,對話系統(tǒng)等需要對輸入進(jìn)行處理的系統(tǒng)都可以這樣做。
如何讓整個流水線運作起來,我們還需要一個ChainManager類來進(jìn)行管理。
ChainManager所需要包含的功能是將所有的系統(tǒng)組成一條流水線,并且調(diào)用它們所擁有的Process方法進(jìn)行處理。
我的思路是:既然系統(tǒng)是掛載在場景的GameObject上,那么可以創(chuàng)建一個GameObject數(shù)組,在編輯器的Inspecter窗口中,將各個系統(tǒng)按流水線的運作順序添加進(jìn)來。
就像這樣:

然后,通過遍歷數(shù)組的方式,按照運作順序調(diào)用InputProcess方法進(jìn)行處理。
(如果DialogueSystem將輸入設(shè)為0,那么玩家也就不可再移動。)
完整的ChainManager如下:

最后,只需要讓PlayerController調(diào)用InputProvider中的各項參數(shù)實現(xiàn)想要的效果即可。