上文我們說到在Actor層次,UE用Controller來充當APawn的邏輯控制者,也有了可以接受玩家輸入的PlayerController,和能自行行動的AIController。Actor的邏輯編寫介紹完了,那么本篇,我們繼續(xù)爬升,對于由Actors組成的Level這一層次,UE又是怎么控制的呢?
對Level記不太清楚的朋友,可以翻回去查看“GamePlay架構(gòu)(二)Level和World”的講述,簡單概括就是World是由一個PersisitentLevel和一些subLevels組成的,PersisitentLevel切換了,相應(yīng)的World也會切換。所以本文的關(guān)注點是在這么一個對象層次結(jié)構(gòu)下,UE是怎么設(shè)計的,我們又能做些什么。

GameMode

Level,在游戲里的概念里,就是關(guān)卡的意思。同時作為游戲的玩家和開發(fā)者,我們總是會非常經(jīng)常的提起關(guān)卡,但是關(guān)卡具體又是個什么定義呢?游戲里的哪些部分可以算是一個關(guān)卡?簡單的我們都知道有《憤怒的小鳥》或《植物大戰(zhàn)僵尸》的關(guān)卡,復(fù)雜的有大型FPS游戲里的關(guān)卡,而對于更大型的《暗黑3》或者大型無縫地圖RPG游戲《巫師3》,甚至是號稱超級廣闊宇宙《無人深空》,我們能直接了當?shù)恼f出哪部分是關(guān)卡嗎?游戲行業(yè)發(fā)展如今,為了更好的組織游戲邏輯和內(nèi)容資源,也發(fā)展出了一些概念來更好的理解和闡述,雖然叫法不同,不過含義理念都是相通的。比如,Cocos2dx會認為游戲就是由不同的Scene切換組成的,每個Scene又由Layer組成;Unity也認為游戲就是一個個Scene;而UE的視角的是,游戲是由一個個World組成的,World又是由Level組成的。這些概念有什么不同?
讓我們從游戲本身的機制上分析:

  • 游戲或玩家的節(jié)奏,游戲可以分成一個個階段,馬里奧里的關(guān)卡就是一個階段,而RPG游戲的一個大地圖也是一個階段。一個游戲也可能只有一個階段,比如一直在宇宙里漫游的游戲。通常一個階段結(jié)束后,會有一個結(jié)算,階段之間,玩家也能明顯感覺到切換感。
  • 游戲的機制,有時候即使是同樣的場景,玩家卻也能感覺就像在玩兩個不同的游戲,比如MOBA里的同一張地圖上的各種不同挑戰(zhàn)模式。
  • 游戲的資源劃分,有時候也能遇見同一個玩法應(yīng)用在不同的場景上,比如賽車游戲的不同跑道。有時候也會在游戲的大地圖里從酷熱的沙漠到寒冷的極地。游戲開發(fā)中也總是傾向于給游戲用到的資源劃分成組的進行載入和釋放。

通過以上的分析,也和以前的一貫思路一樣,我們發(fā)現(xiàn)在思考“關(guān)卡”這件事情上,也是要保持頭腦清晰的分清“表示”和“邏輯”。玩法就是“邏輯”,場景就是“表示”。所以我們?nèi)绻赃壿媮韯澐钟螒?,得到的就是一個個World的概念;如果以表示來劃分,得到就是一個個Level。一場游戲中,玩法再復(fù)雜但也只有一個,場景卻可以無限大,所以可以有很多個表示拼接組裝,因此是World包含Level,而不是反過來?,F(xiàn)在回過頭來回想一下Cocos2dx和Unity的世界觀,它們的概念還只是在表示層,在游戲?qū)嵗完P(guān)卡之間少了一個更高級的邏輯概念。
因此UE的世界觀是,World更多是邏輯的概念,而Level是資源場景表示。以《巫師3》為例,有好幾個國家之間通過傳送切換,國家內(nèi)大地圖無縫漫游,顯然我們知道不可能把一個國家的所有資源都加載進內(nèi)存,因此在UE里,一個國家就是許多個Level拼接的,而一個國家就是一個World,它們可以有不同的模式玩法。但畢竟AAA游戲很少,通常的,我們的游戲比較簡單的用一個Level就夠了,否則這個場景表示的概念就應(yīng)該叫Area更合適了,也因此通常的這里的Level也常常對應(yīng)游戲里玩家面對的"關(guān)卡",也因此UE里L(fēng)evel的Settings叫做WorldSettings了。
厘清了這些概念了之后,我們就知道,當我們在談Level的業(yè)務(wù)邏輯控制的時候,我們實際上談的是World的業(yè)務(wù)邏輯。按照UE的設(shè)計理念和經(jīng)過Controller的經(jīng)歷,我想我也不用多解釋了從Actor再派生出一個WorldController的方式了,可以直接的享受Actor已經(jīng)提供的一切福利。一個World的Controller想不出有什么需要展示渲染的,因此可以直接從AInfo派生吧。哦,WorldController是我瞎編的,在UE3里它叫做GameInfo,到了UE4它改名為了GameMode?;\統(tǒng)的講,一個World就是一個Game,把玩法叫做Mode,我們應(yīng)該也能接受吧。那我們來看看它: