引言

上文我們談到了Component-Actor-Pawn-Controller的結(jié)構(gòu),追溯了AController整個(gè)家族的崛起和身負(fù)的使命。本篇我們繼續(xù)來(lái)探討Controller家族中最為人所知的PlayerController和AIController。
作為一個(gè)Controller,我們討論的依然是該如何控制。我們已經(jīng)知道了Controller可以Possess并控制Pawn,但是Controller本身又是怎么驅(qū)動(dòng)起來(lái)的呢?一個(gè)游戲里的控制角色大抵都可以分為兩類:玩家和AI。不管是單機(jī)游戲或者分屏多玩家,還是網(wǎng)絡(luò)玩家聯(lián)機(jī)對(duì)戰(zhàn),游戲都是為了玩家服務(wù)的,所以也必然會(huì)有一個(gè)或多個(gè)玩家,就算是如《山》那種純看的游戲,也是有一個(gè)“可觀察不可動(dòng)”的玩家的。而AI的實(shí)體的數(shù)量就可以是零或者多個(gè)。
Note1:依舊重申:輸入、網(wǎng)絡(luò)、AI行為樹(shù)等模塊雖跟PlayerController和AIController關(guān)系緊密,但目前都暫且不討論,留待各自模塊章節(jié)再敘述。

APlayerController

讓咱們先從簡(jiǎn)單的單機(jī)游戲開(kāi)始討論吧,比如一款單機(jī)FPS游戲,這個(gè)游戲里已經(jīng)用各種各樣的Actor們構(gòu)建完成了世界場(chǎng)景,你的主角和敵人Pawn們也都在整裝待發(fā),這個(gè)時(shí)候你思考這么一個(gè)問(wèn)題,我該怎么玩這個(gè)游戲?壯麗的舞臺(tái)已經(jīng)準(zhǔn)備好了,就等你入場(chǎng)了。先拋開(kāi)具體的引擎而言,首先你需要能看見(jiàn)(擁有Camera和位置),其次你必須能響應(yīng)輸入(玩家按WASD你應(yīng)該能接收到),然后你可以根據(jù)輸入操控一些Pawn(Possess然后傳遞Input),這樣一個(gè)單機(jī)游戲中的簡(jiǎn)單玩家控制器就差不多了。一個(gè)游戲中只有一個(gè)PlayerController,在不同的關(guān)卡中你可以使用不同的PlayerController,但是同一時(shí)刻響應(yīng)的只能是一個(gè)PlayerController。
插上多個(gè)手柄,咱們?cè)偻卣挂幌?,比如像《街霸》那種單PC但是多玩家對(duì)抗或者協(xié)作的游戲。兩個(gè)玩家可以分別用兩個(gè)手柄,或者一個(gè)用鍵盤(pán)一個(gè)用鼠標(biāo),甚至是鍵盤(pán)上的不同區(qū)域,形式可以多種多樣。這個(gè)時(shí)候如果依然只有一個(gè)PlayerController,實(shí)現(xiàn)起來(lái)其實(shí)也是可行的,把兩個(gè)手柄——所有的輸入都由這個(gè)PlayerController來(lái)接收,然后在PlayerController內(nèi)部再分別根據(jù)情況去處理不同的Pawn。但是這種方式的缺點(diǎn)顯然也在于很容易把玩家1、2的輸入和控制混雜在一起,沒(méi)有清晰的區(qū)分開(kāi)。因此,為了支持這種情況,我們可以開(kāi)始允許游戲中同時(shí)出現(xiàn)多個(gè)PlayerController,每個(gè)PlayerController甚至都可以擁有自己的Viewport(分屏或者不同窗口),這樣我們通過(guò)配置,可以精確的路由手柄1的輸入給玩家1,各自的邏輯也很好的區(qū)分和復(fù)用。
再插上網(wǎng)線繼續(xù),到了網(wǎng)游時(shí)代,我們的游戲就開(kāi)始允許有多人聯(lián)機(jī)對(duì)戰(zhàn)了。玩家在自己的PC上控制的只是自己的本地的角色,而屏幕游戲里其他的玩家角色是由網(wǎng)線另一端的玩家控制的。為了更好的適應(yīng)這種情況,我們就又得擴(kuò)展一下PlayerController的概念,PlayerController不僅能控制本地的Pawn,而且還能“控制”遠(yuǎn)程的Pawn(實(shí)際上是通過(guò)Server上的PlayerController控制Server上的Pawn,然后再?gòu)?fù)制到遠(yuǎn)程機(jī)器上的Pawn實(shí)現(xiàn)的)。
因此我們來(lái)看看UE里的PlayerController: