你們對力量一無所知

引言

回顧上文,我們談完了World和Level級別的邏輯操縱控制,如同分離組合的AController一樣,UE在World的層次上也采用了一個(gè)分離的AGameMode來抽離了游戲關(guān)卡邏輯,從而支持了邏輯的組合。本篇我們繼續(xù)上升一個(gè)層次,考慮在World之上,游戲還需要哪些邏輯控制?
暫時(shí)不考慮別的功能系統(tǒng)(如社交系統(tǒng),統(tǒng)計(jì)等各種),單從游戲性來討論,現(xiàn)在閉上眼睛,想象我們已經(jīng)藉著UE的偉力搭建了好了一個(gè)個(gè)LevelWorld,嗯,就像《西部世界》一樣,場景已經(jīng)搭建好了,世界規(guī)則故事也編寫完善,現(xiàn)在需要干些什么?當(dāng)然是開始派玩家進(jìn)去玩啦!
大家都是老玩家了,想想我們之前玩的游戲類型:

  • 玩家數(shù)目是單人還是多人
  • 網(wǎng)絡(luò)環(huán)境是只本地還是聯(lián)網(wǎng)
  • 窗口顯示模式是單屏還是分屏
  • 輸入模式是共用設(shè)備還是分開控制(比如各有手柄)
  • 也許還有別的不同

假如你是個(gè)開發(fā)游戲引擎的,會(huì)怎么支持這些不同的模式?以筆者見識(shí)過的大部分游戲引擎,解決這個(gè)問題的思路就是不解決,要嘛是限制功能,要嘛就是美名其曰讓開發(fā)者自己靈活控制。不過想了一下,這也不能怪他們,畢竟很少有引擎能像UE這樣歷史悠久同時(shí)又能得到足夠多的游戲磨練,才會(huì)有功夫在GamePlay框架上雕琢。大部分引擎還是更關(guān)注于實(shí)現(xiàn)各種絢麗的功能,至于怎么在上面開展游戲邏輯,那就是開發(fā)者自己的事了。一個(gè)引擎的功能是否強(qiáng)大,是基礎(chǔ)比拼指標(biāo);而GamePlay框架作為最高層直面用戶的對接接口,是一個(gè)引擎的臉面。所以有興趣游戲引擎研究的朋友們,區(qū)分一個(gè)引擎是否“優(yōu)秀”,第二個(gè)指標(biāo)是看它是否設(shè)計(jì)了一個(gè)優(yōu)雅的游戲邏輯編寫框架,一般只有基礎(chǔ)功能已經(jīng)做得差不多了的引擎開發(fā)者才會(huì)有精力去開發(fā)GamePlay框架,游戲引擎不止渲染!
言歸正傳,按照軟件工程的理念,沒有什么問題是不能通過加一個(gè)間接層解決的,不行就加兩層!所以既然我們在處理玩家模式的問題,理所當(dāng)然的是加個(gè)間接層,將玩家這個(gè)概念抽象出來。
那么什么是玩家呢?狹義的講,玩家就是真實(shí)的你,和你身旁的小伙伴。廣義來說,按照圖靈測試?yán)碚?,如果你無法分辨另一方是AI還是人,那他其實(shí)就跟玩家毫無區(qū)別,所以并不妨礙我們將網(wǎng)絡(luò)另一端的一條狗當(dāng)作玩家。那么在游戲引擎看來,玩家就是輸入的發(fā)起者。游戲說白了,也只是接受輸入產(chǎn)生輸出的一個(gè)程序。所以有多少輸入,這些輸入歸多少組,就有多少個(gè)玩家。這里的輸入不止包括本地鍵盤手柄等輸入設(shè)備的按鍵,也包括網(wǎng)線里傳過來的信號,是廣義的該游戲能接受到的外界輸入。注意輸出并不是玩家的必要屬性,一個(gè)玩家并不一定需要游戲的輸出,想象你閉上眼睛玩馬里奧或者有個(gè)網(wǎng)絡(luò)連接不斷發(fā)送來控制信號但是從來不接收反饋,雖然看起來意義不大,但也確實(shí)不能說這就不是游戲。
在UE的眼里,玩家也是如此廣義的一個(gè)概念。本地的玩家是玩家,網(wǎng)絡(luò)聯(lián)機(jī)時(shí)雖然看不見對方,但是對方的網(wǎng)絡(luò)連接也可以看作是個(gè)玩家。當(dāng)然的,本地玩家和網(wǎng)絡(luò)玩家畢竟還是差別很大,所以UE里也對二者進(jìn)行了區(qū)分,才好更好的管理和應(yīng)用到不同場景中去,比如網(wǎng)絡(luò)玩家就跟本地設(shè)備的輸入沒多大關(guān)系了嘛。

UPlayer

讓我們假裝自己是UE,開始編寫Player類吧。為了利用上UObject的那些現(xiàn)有特性,所以肯定是得從UObject繼承了。那能否是AActor呢?Actor是必須在World中才能存在的,而Player卻是比World更高一級的對象。玩游戲的過程中,LevelWorld在不停的切換,但是玩家的模式卻是脫離不變的。另外,Player也不需要被擺放在Level中,也不需要各種Component組裝,所以從AActor繼承并不合適。那還是保持簡單吧: