高居iOS暢銷榜第3,《幻塔》如何實現開放世界自由探索玩法的?

本周,完美世界旗下幻塔工作室開發的輕科幻開放世界游戲《幻塔》已於12月16日正式公測,發布以來《幻塔》持續保持在免費榜冠軍、暢銷榜TOP10,首日流水破5000萬元,最近三天更是位居iOS暢銷榜第3,可謂今年年末國內市場最大爆款,取得了優異的成績。

本月初,Epic Games中國所舉辦的「Unreal Open Day虛幻引擎技術開放日」上,幻塔工作室的工程師李寧徽,就分享了《幻塔》開放世界自由探索的製作經驗。

他從地形探索、物件探索、玩法探索三個層面,分享了《幻塔》在開發過程中所遇到的問題和解決辦法。

以下是演講實錄:

李寧徽:大家好!我是來自完美世界幻塔工作室的游戲工程師,李寧徽。今天給大家帶來的是《幻塔》開放世界自由探索製作分享,涉及的主要內容包括,作為游戲玩家在游戲世界中,對大世界中的地形、事物和玩法進行自由探索交互。

在這之前,請允許我簡單介紹一下這款游戲。《幻塔》是一款輕科幻開放世界ARPG手游,以廢土輕科幻的美術風格,開放式的成長線和引力式的目標感,包含豐富的大世界玩法和爽快的戰鬥體驗為主。

在游戲中,玩家可以探索無接縫大世界,可以高度自由度交互,比如遇到障礙就跨越或者翻越,碰到高牆或山體就攀爬,跳入水中就游泳等。當然我們也可以對大世界中的一些物件,也可以進行推箱子、舉盒子等操作,甚至還可以去遊樂場坐過山車和旋轉木馬。本次演講就是分享我們在製作這些有趣玩法過程中遇到的問題和解決辦法。

這次演講所說的開放世界自由探索,不是從游戲玩法和游戲設計角度出發,而僅僅從功能實現角度出發。比如說走過的路,地下會留下腳印,蹚過水會泛起漣漪,對大世界有所動作,大世界也會給我對應的反饋。

我簡單的把實現探索世界分成了三類,分別是地形探索、物件探索,玩法探索,下面我們先從地形探索說起。

這裡有一個小視頻,可以從視頻可以看到,玩家跑過地上會留有腳印,進入水中,水中泛起漣漪,從水中就會產生新的腳印。如果仔細看一下,從水中出來的腳印是要比沒有入水時的腳印顏色是要更深一點的。之前版本裡面,從水中出來的腳印還有水漬效果,後來去掉了,為什麼去掉後面會有解釋。

在過去很多的游戲中,腳印這樣的功能已經有了,有些游戲甚至把腳印的效果做得非常好。一般對腳印的功能需求是踩在地上,留下個印子,稍微要求高一點的話,就會要求踩在不同的地表上,會留下不同的腳印。比如沙地上、草地上,腳印是不一樣的。再比如說從水中出來可以添加水漬的效果,踩在雪地上會有那種的凹凸感,濺起的雪花效果等。

腳印的表現,我們可以用貼花、粒子等進行製作,用貼花做腳印的效果是好的,但貼花的性能消耗特別大。特別是貼花剛剛創建生成的時候,對於手游來說,由於手機的內存有限,表面溫度、手機續航都是手游體驗很重要的一部分,所以我們做了取捨。

我們只是用簡單面片的來創建腳印Actor,並且對其做緩衝池處理,這個時候我們只是對緩衝池裡的腳印做透明度、是否顯示以及顯示位置,對這些屬性進行控制,不再反覆地創建和銷毀,以此來降低消耗,當然這是根據游戲需求和優化做出的取捨,這是為什麼之前把水漬效果去掉的原因。

剛才說的腳印,其實是玩家和地面的交互,而漣漪就是玩家和水面的交互。我們可以看左邊,當玩家走過的時候,漣漪是波紋狀,如果是摩托車就會有把水推開的效果。而游泳、水花特效等都是玩家和水面的交互,只是他們有一個共同點,這些交互的效果只生存在水面上,而且交互對象的形態不同,所產生的效果也不一樣。

氣候冷暖的反應,我勉強將其稱之為玩家和空氣的交互,在不同的氣候區域裡面,玩家的表現不一樣。在很冷的區域,玩家的角色會有搓手等表現其很冷的動作,在熱的區域中,玩家會有扇汗的動作。其實這個製作起來很簡單,在不同氣候區域添加觸發器盒子就可以了,當然也可以在此基礎上做一些其他的玩法,比如說添加buff什麼的,這些效果實現起來很簡單,但是給玩家的感受卻很好。

接下來我們談一談對障礙的跨越翻越。虛幻引擎4的移動組件中有個屬性,叫MaxStepHeight,當障礙高度超過這個值的時候,玩家就會被擋住,這個時候玩家要麼沿著障礙表面滑動,要麼被擋住無法繼續前行,雖然我們可以通過跳躍去越過障礙,但如果使用手機,不停的按跳躍就必然會影響到其他操作,而且也不是所有的障礙都可以通過跳躍跨越過去。因此對於開放世界自由探索類游戲,特別是手游,這個時候角色可以自動跨越或翻越障礙功能的需求就很強烈了。

傳統製作翻越障礙的方式有很多種,但或多或少都有一些問題。比如跨越動作帶有位移,那麼就要求跨越障礙的高和寬有限制,而這就會影響美術的發揮。比如在障礙上添加標記、添加觸發盒子等,這些都會增加額外的工作量,還有網路同步這些。所以,可不可以有一種情況,我對大世界中的任意障礙物都沒有任何限制,美術自由發揮,完全是程序自動檢測翻越,做出翻越的操作。

下面是我們的答案。剛才提到的那些有限制的製作方式,我們稱之為策劃美術驅動方式,而我們這種相當於是完全是程序驅動,也就是說,我們對地形、障礙沒有添加任何限制,美術自由發揮去做,我們也不會添加標記或者設置觸發器,從頭到尾基本是由程序根據地形檢測演算法算出來的。我們算出障礙物的高度、翻越時候的落腳點,根據障礙物的高度選擇合適的動作進行跨越操作。

這裡展示的三種操作,分別是低、中、高。低的話,一抬腳上去了,中間稍微高一點,就需要用手撐一下,右邊的比較高,需要手夠一下才能翻上去。我們已經可以做到配置,可以做三種、五種甚至十種這樣的方式。

那我們怎麼做的?在移動組件裡面,它自帶了幾種基礎的移動模式,但這幾種基礎的移動模式不太合適做跨越,所以我們建立了自定義移動模式,專門處理跨越。得益於移動組件可維護性、可重用性和可擴展性的強大,我們其實相當於站在巨人的肩膀上,省去了很多麻煩,比如網路同步問題。

那麼跨越最關鍵的地方是哪裡?我們這裡是,要計算出跨越後的落腳點,一旦落腳點計算出來,那麼跨越的高度也就計算出來了,我就會根據跨越的高度,選擇合適的動作進行越過障礙。在落腳點層面也有幾點需要注意,比如地形的斜度是否允許角色站上去,玩家的可站立半徑,還有在這個過程中的動作銜接問題。

剛剛說的是一些正常時候的跨越,但也存在一些特殊的情況。比如說在水中游泳時跨越障礙,游泳時候計算的落腳點相對於行走有一點不一樣,但是主要的思路是一樣的,就是把落腳點計算出來。然後還有右邊這種,如果障礙的高度超過了我們配置的最大障礙高度,這個時候可以通過攀爬翻越來越過障礙。

當然,因為玩法的關係,比如我們策劃要求在這個玩法、這個關卡裡面,這個地方不允許跨越,不能翻越,這個時候怎麼處理?傳統用來製作可以攀爬翻越的方法,就可以在這個時候反過來做這個地方不能攀爬,就是我們可以打標記,可以添加觸發器。

在這個地方有一些需要注意的點,因為我們對地形沒有做任何的限制,美術可以任何自由的發揮,可以隨便作,所以難免會遇到奇葩、稀奇古怪的地形,導致計算過程中,落腳點和障礙高度不準確。

比如說有一些往前傾斜的地形,有凹槽的地形,還有浮空的地形,有一個節點,膠囊體底部不是在地表的情況,都會導致計算的落腳點不是那麼準確,這個時候我們就需要在地形檢測演算法中添加一些額外的檢測來避免這些問題,所以我們的地形檢測演算法也是在不斷的優化迭代的過程,慢慢變得成熟。

現在我們來說說攀爬,類似跨越一樣,我們的攀爬其實也基本是程序驅動,我們沒有對地形做任何限制,美術可以自由發揮,我們也不打標記點或者添加觸發盒子,通過地形檢測演算法,玩家可以攀爬到的地方,玩家攀爬的速度,以及玩家的朝向,完全是程序計算出來。

在虛幻引擎4中,因為攀爬是一種脫離重力的表現,而且一旦脫離攀爬就會掉下來,所以我們的方案是,用移動組件裡面的Flying模式模擬攀爬的移動狀態,我們還有很多自定義的子模式,分別應對攀爬的不同的情況。比如說各個方向上的自由攀爬,攀爬跳躍、攀爬回跳、雨天攀爬打滑的狀態,攀爬翻越等,在攀爬的時候,我們的角色會通過動作融合和蒙太奇配合,讓攀爬的狀態更加自然合理。

這邊展示了三種進入攀爬的情況,分別是行走進入攀爬、下翻進入攀爬、空中進入攀爬,其實還有一個水中進入攀爬。三種檢測攀爬的計算方式是都不一樣的,但有個共同點就是首先要找到可以攀爬的面。

現在我們展示的都是自動進入攀爬,之前的版本在進入攀爬的時候有過一個非常不好的游戲體驗,玩家在操作手機的時候,是不希望進入攀爬,只是想走進去,特別是室內的情況,只是想走進屋裡看一看,這時候一旦碰到障礙就進入攀爬了,比如說爬到牆上或者櫃子上,體驗非常糟糕。

我們怎麼處理的?一個是,我們在游戲設置里添加了選項,玩家可以選擇自動進入攀爬,也可以選擇手動進入攀爬。二是添加了進入攀爬的動作,在這個動作裡面添加了Anim Notify State,如果期間沒有移動輸入沒有被打斷,就進入到攀爬,但如果在這段時間裡,輸入突然停掉了,就表示不想進入攀爬,就會把進入攀爬動作打斷,不進入攀爬,以這樣的方式解決問題。

這裡左邊的我們把它稱之為凸型地形上攀爬,現在其實已經有很多游戲都有攀爬功能,還有很多關於攀爬的教程。我注意到他們都是在攀爬動作裡面有骨骼位移的,我們採取的方案是,所有的攀爬動作、蒙太奇都是不帶骨骼位移,所有位置、速度、玩家的朝向都是通過程序演算法算出來的。

這樣做的好處是,我們所能到達的位置能夠不受骨骼位移里,自帶的位移和朝向的影響。右側顯示是凹形地形的表現,一般的運動模式,比如說行走、游泳,它們一般是在X軸和Y軸水平方向上,但是攀爬是三個方向上的,所以這邊我們討了個巧,因為攀爬時和地形息息相關,攀爬始終貼著地形,一旦脫離地形就要掉下來,所以在X軸方向,也就是前後方向,我們始終讓玩家往前緊貼地形,這樣我們就可以把我們更多的注意力集中在Z軸和Y軸方向,也就是前後左右方向,這樣我們相當於把三個方向的計算省去了很大一部分,變成兩個方向的計算。

拐彎的時候,玩家的朝向需要注意一些,特別是右邊的凹形地形,我們的手其實是沿著地形滑過來的,這是用IK,我後面還會提到。

攀爬跳躍,這方面其實也是攀爬中的重要元素,我們可以把攀爬跳躍可以跳的距離、速度作為參數拋出來,策劃可以進行配置,當然也可以在游戲中根據玩家的屬性動態修改。

玩家搖桿或者鍵盤輸入會有一個方向,我們沿著這個方向做檢測,算出攀爬跳躍的結束點,配合蒙太奇在這邊進行攀爬跳躍,左邊是各個方向的攀爬跳躍,中間是凹凸地形上的,我們會爬到凹凸地形上轉向等,右邊是攀爬到頂了會翻越上去。

這是IK( Inverse Kinematics),即反向動力學,相對FK來說,它是用子節點驅動父節點。它的實現方式就是用動畫藍圖里的Two Bone IK節點。這個節點有兩個參數,一個是Effector,一個是Joint Target。

Effector可以這麼理解,目標點,攀爬的時候手要搭在哪裡。比如說踩在階梯上腳放在哪裡,要通過計算算出來。而Joint Target節點,因為在多骨骼計算的時候,計算出的結果是無限多個的,所以要通過Joint Target的參數來確定唯一解,避免出現反關節的不合理情況。比如爬的時候,肘關節都到臉上了,這種情況就可以通過這個參數來避免。

如果站在台階上,腳是分別踏在兩個不同的台階上,當地面不平的時候,腳面是要貼著地面做旋轉。再比如爬樹的時候,手抱著樹,如果是凹形地面,手是分別搭在兩邊的。有很多關於IK好用的教程和插件,比如說PowerIK,但是其對於移動端的支持其實還是有一些進步空間,特別是旋轉這一塊,所以我們游戲裡面主角的IK基本上都是我們自己實現的。

滑板是地形探索裡面唯一一個涉及到海陸空,也就是說我們承載移動組件裡面的Walking、Falling、Swimming三種運動模式實現滑板。它需要注意的點就是在這幾種模式切換的時候,我們要保證動作和速度可以很平滑的過渡過去,我們做這個目的是為了讓玩家在操作的時候有爽快的感覺。

滑翔,因為人類不可以飛,所以在游戲里可以飛或者滑翔是很好的游戲體驗,所以我們就製作了滑翔。它是通過重載移動組件里的Falling來做的,我們修改、優化了它的轉向,以及重力加速度來實現滑翔。

游泳方面,虛幻引擎4裡面其實有游泳模式,我們也添加了一些自己的東西,比如說加速游泳,還對它的轉向做了優化,因為手機上的遙感有一些特別,所以我們在這一塊比較花心力的是,在手機上的操作手感,這方面我們花了一些精力去做優化。

這裡總結一下,我們所有地形探索遵循的一個原則,就是一句話,膠囊體負責位置,Mesh負責表現。

膠囊體負責的是碰撞、位置同步,而且我們所有地形檢測的演算法都是從膠囊體開始的,也就是說,膠囊體是出發點,我們所有的地形檢測演算法都是從它開始做同步。

而Mesh主要負責視覺效果,比如視覺效果的平滑過渡、不同狀態之間的切換、動作的銜接,包括IK等。舉個例子,比如攀爬的時候,前面正好有一個東西把我頂出來了,那我的膠囊體肯定就會頂歪,但這個時候Mesh不能歪,一旦歪的話就相當於脫離了地形,就掉下來了,這個時候就可以讓Mesh往前抓緊貼地形,相當於允許Mesh稍微脫離一點我的膠囊體。

下面我們看物件探索,首先看推箱子。我們實現了兩種方式分別是:模擬物理的和不模擬物理的,兩種推箱子有各自的優缺點。模擬物理方式的箱子,在掉落、碰撞、滾落等情況的表現更為自然,效果特別好,但是有一個很不好的缺點,就是不可控因素很多,如果地形不平,碰撞角度、速度、力度不同,所出來的結果是完全不一樣的。

特別是在一些玩法的層面,左邊這是一個激光,我要把箱子推到那個地方才能打開機關,但如果是用模擬物理的箱子,可能我每推一次結果就不一樣,就完成不了。

所以我們就做了第二種不模擬物理的推箱子,這種方式推10次,推20次,甚至推100次,始終能把箱子推到這個地方來,保證結果一樣。所以在大世界中,我們交互的箱子一般是採取了模擬物理的這種,而在機關或者一些簡易玩法裡面我們選擇了不模擬物理的箱子。

舉拋方面我們是這麼實現的,我們製作了ControllableComponent的一個組件,凡是擁有這個組件的物件都是可以進行操作的,包括舉拋。在拋的時候,其實就是把物件Attach到指定的點上,然後配合半身動作實現舉起移動,拋的時候會通過玩家輸入獲得指定方向,在那個方向給一個初始速度,並啟動模擬物理來實現的,就拋出去了。

砍樹方面,樹是由Foliage植被系統刷出來的,當我們揮刀砍的時候,刀的Mesh就會和樹的Mesh發生碰撞,這個時候會播放樹被砍倒的效果,然後用樹樁的Mesh替換樹的Mesh來實現砍樹,過一段時間再將樹樁的Mesh替換回樹的Mesh就刷回來了。

草也是由Foliage植被系統刷出來的,但是草和樹不同,草沒有碰撞,因此實現的辦法是在AT表上做標記,然後在那個位置播一個砍草的效果,如果要恢復就在一定時間把AT標去掉,把這個草重新刷出來實現砍草。

我們現在看看過山車。我們提供了好幾種視角,玩家可以根據自己的喜好去選擇一種適合自己的視角。其實最開始我們是沒有計劃做過山車的,在於之前的測試裡面,有玩家跟我們說,我們都到遊樂場了,有那麼一個東西為什麼不能玩,我們要玩過山車,我們就做了這個東西。

包括旋轉木馬也是那個時候做的,在遊樂場里坐旋轉木馬的時候,過山車也是在走的。旋轉木馬、摩天輪、過山車等實現起來不難,但是它們給人的感受非常好,有一種身臨其境的感受,同時這種玩法對女性玩家和小孩子非常有吸引力,而且還可以和游戲的朋友一起做旋轉木馬一起玩,可以增加游戲中的交互。

其實過山車、旋轉木馬、摩天輪,它們有一個共同的特點,它們始終是沿著一個固定的軌跡在重複的運行,所以我們實現起來也是一樣的。

首先第一個,當進行交互的時候,把玩家attach到一個點上,我們會控制玩家的視角,提供幾種視角,玩家可以根據自己的喜好選擇合適的視角,我們就會播放一個LevelSequence,讓它在固定的軌跡上重複操作,最後我們要布置Spline,保證過山車的移動速度和節奏,這樣就會給玩家一種身臨其境的感覺。

實際上,游戲裡面還有很多其他的交互情況,我們做了很多,比如抓手,扔個東西過去一下把自己拉過去,比如磁場等,而且既有玩法也有物件的,比如踢足球、保齡球等,這是一個遊樂場,我們現在已經做到遊樂場里所有的設施都可以交互,可以去抓娃娃,打小飛機等。

最後,我們公司的《幻塔》馬上16號就正式公測,如果大家有興趣可以體驗一下。如果你們願意加入我們,也歡迎聯繫我們,當然如果只是作為一個游戲玩家,你也可以把奇思妙想,通過郵件或者留言的方式告訴我們,說不定你的想法被採用,我們就把他實現了,就像之前所說的過山車一樣。

我們希望這種方式實現的交互越來越多,因為這就會使玩家有一種參與游戲開發的感覺,我們也希望後面會有越來越多這樣的東西出現。

我的演講就到這裡,謝謝大家!

隨便看看 更多

相關內容 更多