寫在前面
本項目同步上傳于coding上,國內讀者可以通過在coding下載項目。
也歡迎你加入我的UE4學習交流QQ群:872537977。如果你喜歡我寫的文章,也希望你點贊、收藏、轉發。謝謝!
如果你喜歡我寫的文章,也希望你點贊、收藏、轉發。謝謝!
如果你想參與到這個項目的開發中來,唯一的要求是像我一樣編寫開發日志讓更多的人看到并學習。
coding地址:https://git.dev.tencent.com/JeremyBrett/uRPG.git
上周五這周一請了兩天假,去內蒙古額爾古納散散心。回來之后就感覺很疲憊,前幾天下班回到家都是秒睡。今天算是緩過來一點了吧。這些天把開發任務暫時擱置了,在路上我也看了不少關于隨機地形的技術文章吧。還是有點兒困惑的,這次決定一反常態。不再記錄開發過程,而是把思考的過程也記錄下來跟大家分享,也希望小伙伴們能有些好的意見或者建議吧。大家分享一下。
Rougelike思考
在之前的策劃案那一期,我說我想做一款Rougelike向游戲,或者說沙盒游戲吧。這主要是考慮到我自己的短板,既沒有強大的劇情腳本撐腰,也沒有很好的美術效果或者程序產能。在這種情況下,能夠重復游玩的Rougelike游戲似乎是我絕佳的選擇。換句話說,我唯一能搏一搏的就只有“游戲性”了。
之前有寫過一篇關于Rougelike游戲中的資源投放設計的文章,看的人還挺多的。也有人質疑這部分內容應該是“關卡”內容而非“數值”內容。實際上所有和游戲體驗(游戲節奏)相關的內容都是有數值參與的。曾經有同事說出“我認為調體驗能不用數值就不用數值”的高論。我當時就很好奇“游戲體驗,不調數值?那調什么呢?”。有些人對數值的工作范疇有誤解,以為游戲中只有屬性、戰斗和道具價格,物品掉率這些和數值有關系。但世界上并非如此。
即使在一個線性敘事的單機游戲中,也要將一些核心參數抽象出來,用來不斷調試,達到最滿意的體驗。比如說這個線性敘事游戲總流程1小時,其中分為2個大章節(每章30分鐘),每個章節中有5個小段落(每段6分鐘),然后每個段落中會有1場戰斗(2分鐘),還有3個謎題(每個1分鐘)。這樣不斷拆解下來,就對要做的游戲有了更為客觀、理性的認知。也就解決了不知道如何開始制作的問題。
有點兒扯遠了,還是說會Rougelike的問題上來,在這個游戲中,我首先想到的就是可重復游玩的價值。《文明》為什么會不停的開新存檔?為了刷出一個更新奇的開局地點。每一次開局都會至少在前期創造一種完全不同的游戲體驗。《饑荒》、《minecraft》等沙盤生存游戲也是如此。
但是我又想到了另一種不同的可能性,那就是《騎馬與砍殺》。騎砍的地圖并不是隨機的,騎砍隨機的是另一個維度——事件。騎砍的世界有一套自己運行的機制,所以雖然世界是固定的,但事件是隨機的。因此每一個新的存檔的體驗也會有很大不同,這種差異是很強烈的。換句話說,即使玩家有意為之,也很難復刻完全相同的劇情。
但是關于隨機事件,這是另一個話題了。我們今天首先考慮的還是隨機地形的問題。
什么程度的隨機地形
事實上我一直再考慮這個問題,是否要使用隨機地形?是哪種程度的隨機?是體素世界嗎?是無限還是有限的?
我很快回答了第一個問題:我要使用隨機地形!原因很簡單,有隨機地形元素的游戲讓我著迷。我能隨便說出我游玩時間最長的游戲:《饑荒》《文明》《缺氧》《環世界》《放逐之城》等等都是隨機地形的!我著迷的游戲元素,我也能最大程度的去還原這部分游戲體驗。
接下來第二個問題:是哪種成都的隨機呢?
要不要做一個體素的世界呢?從《minecraft》開始,到最近玩的《方舟:方塊世界》、《創世小玩家2》這幾款游戲,我必須要說,體素世界有太大的游戲,那就是堆積木似的游戲體驗。體素是游戲世界的基本組成單位,這帶來的是超棒的擴展性。舉個簡單的例子,未來我想做一個“建造系統”,這個建造系統可能類似《堡壘之夜》、或者其他有建造元素的生存游戲,但是這樣的工作量會翻倍。我也并不知道能否駕馭這種工作量。但是類似的系統在體素世界里要簡單很多!所以這個念頭很誘人,讓我幾乎沒有不使用體素的理由!
現在好了,來回答第三個問題吧:是無限的大地圖嗎?
《minecraft》有著無限的地形,但它的問題就是局部重復性很高。事實上我認為地形的“大”是個很難傳達給玩家的概念,或者說只能作為一個噱頭。玩家在意的是游戲是否好玩,但地形的龐大并不能和游戲行建立直接的關系,參見《無人深空》。基于這個思考,最終我打算使用大小固定的隨即地形,就像《饑荒》或類似的游戲那樣。
現在,基本的方向我們明確了,那么我們來考慮一下關于技術實現的一些設計思慮吧。
使用C++
很不幸的消息就是我在地形生成這部分將使用C++完成,雖然我認為用“藍圖”也可以實現這部分功能。但是眾所周知,使用藍圖來實現算法部分是很痛苦的事情,原因就是運算過程變成一個個節點后反而麻煩,影響開發效率,并且在執行效率上也沒有優勢,我們在開始使用藍圖的時候說,它是為了提高開發效率而犧牲部分執行效率,既然在這個環節上開發效率也沒有提升,那就果斷選擇C++了。
設計過程
我想具體的設計和實現過程可以單獨寫一篇文章了,我這里只是大概介紹一下我實現的順序。首先是實現一個無限生成的大地圖。這個大地圖由若干個Chunk組成。玩家的坐標更新時,這些Chunk會跟著加載或卸載(所謂加載或卸載就是將對應的Actor產生或移除,并將數據緩存起來,以此來達到提升性能的目的)
然后就是使用噪聲來生成不規則的地形了。這部分看起來不容易,但實際上還算簡單。
真正復雜的是關于生物群落的創建,這部分我暫時思路還不是很清晰。一邊做一邊思考實現方式吧。有了解相關實現方式的小伙伴也歡迎分享一下。