一個SLG游戲


2015年11月到2017年4月,我在公司的一個SLG游戲項目組工作。SLG應該是指策略游戲(Simulation Game)。

說的更具體一點,這幾年手機游戲行業出現了兩個標志性的SLG游戲。部落沖突(COC)和海島奇兵(Boom Beach)。

加上后來Supercell另外一個游戲,皇室戰爭。游戲立項的時候,大概是2015年11月,目標是模仿這些主流SLG,

美術風格是星際風格的SLG游戲。游戲最終沒有上線。因為封測的數據比較差,市場和老板覺得沒有必要進行推廣。

心里面有很多想說的,寫在這里吧。雖然失敗了,但是從技術上講,反而比之前的ARPG換皮學到的多。

千頭萬緒從何說起,我是寫邏輯代碼的,先從技術開始,說到哪算哪。

項目組總共有11個程序。

我主要負責戰斗模塊開發,PVP,PVE系統開發,地理位置管理。包括客戶端,服務端。其他小伙伴

一個人負責戰斗尋路,戰斗客戶端系能優化,錄像系統。

兩個人負責建築系統和一個特殊玩法聯盟戰。

一個人負責客戶端場景和2d對象的表現效果,引擎上的支持。

一個人負責攝像頭,客戶端總體優化,引擎上的支持。

一個人負責兵營系統,聯盟系統,及新手指引。(加一個最后一個月才來的新人)

一個人負責郵件系統,AI,和部分PVE副本玩法。

一個人負責SDK相關。

最后主程,統籌所有人的工作。一些框架上的改動。

跟我做的部分相關,技術上有幾個大的難點: 

1.服務端ARPG框架改為SLG框架。

公司的其他游戲全部是ARPG,沒有其他代碼可以借鑒。ARPG有大量的場景管理,副本管理,場景對象管理。

這些大塊在SLG里只有一小部分。

SLG里只有兩個主要場景,主場景和戰斗場景(參考海島奇兵)。

因此把原先在服務端的場景管理,副本管理,場景對象管理刪掉。這些改到客戶端管理。

以前ARPG專門有一個進程Gameworld管理場景,副本,場景對象,尋路,以及角色系統(個人的游戲邏輯)的進程。

有一個Global管理全服的活動,全服的邏輯的進程。

SLG框架去掉了Gameworld,把Gameworld里的角色管理部分移到了Global里面。

 

2.客戶端cocos2d轉Unity3d。

2015年以前只做過cocos2d的一個ARPG。這次需要變到Unity3d。剛開始是被Unity虐的,3d比2d多了很多東西。

不過好在Unity的編輯器比較專業,不像cocos2d的編輯器(公司自己的)有點簡單。

第一次接觸Unity,發現一個和cocos2d完全不同的概念。cocos2d里面的控件是整體性的,Unity里面控件是由Component組成的。

比如cocos2d里一個button就是button控件,它不能是label,不能是sprite。

但是unity里面控件,通過Component可以成為組合,一個button可以有label,也可以有sprite,可以有tween,可以有boxclider。

這其實只是概念上的差別。

雖然是換成unity客戶端,但是腳本邏輯依然使用lua,所以實際編程而言區別不大。

游戲采用3d的場景(兩個場景,主場景和戰斗場景),2d對象。2d對象用的tk2d這個插件。

 

3.全球同服。

如同海島奇兵一樣的全球同服。以前的ARPG都是一個服一個服的,比如排行榜只能在一個服里面排名。

全球同服是世界的所有玩家都在一個服里。這在技術上是怎么實現的呢。

我不知道其他公司怎么樣,我們公司本身有一套跨服框架。

游戲功能上,比如有一些副本可以讓1服2服3服的玩家都進入,這種叫跨服副本玩法。

開啟這種玩法需要多啟動cross的兩個進程。cross,crossmanager。全球同服就是邏輯上只有一個服務器。

通過跨服來實現所有服的玩家在一起玩耍。

 

4.戰斗驗證。

我們把戰斗系統想象成黑盒。假設沒有用戶的操作,輸入數據確定則輸出結果確定。這樣就是一個卡牌游戲的模型。

如果把戰斗系統寫在服務端,由服務端命令隊列驅動客戶端表現。那么就不需要戰斗驗證。

但是因為我們的框架服務端采用c++開發,寫邏輯非常慢,而戰斗系統注定改動非常大。

因此戰斗系統改到客戶端用lua寫。服務端負責下發戰斗數據,客戶端上報戰斗結果之后,服務端再下發戰斗結果。

結果完全是由客戶端計算的。那玩家作弊怎么辦。所以必須有戰斗驗證這一步。

最后采用的是服務端c++跑lua模塊的方式。服務端增加了一個戰斗驗證進程,單獨處理驗證需求。

在服務器下發戰斗數據的同時,通過進程間通信將戰斗數據傳遞給battleserver,battleserver理論上跑lua速度比客戶端快,

也就是客戶端戰斗結束前服務端會有一個戰斗驗證結果出來。將這個驗證結果和客戶端上報的結果做比對。從而實現戰斗驗證。

 

這套戰斗驗證有幾個問題。

a.客戶端lua如果改到戰斗模塊需要重啟服務器。一般客戶端lua都是熱更的。

現在因為戰斗驗證,假設策划需要微調一個兵種的數值,也需要重啟服務器。

b.測試階段會有大量數據驗證異常,影響體驗。由於戰斗模塊頻繁改動,每一次改動都需要大量測試來保證戰斗驗證。

每一次修改戰斗異常的bug后,合並到外網都需要重啟服務器。

c.如果用戶量大,戰斗驗證的請求多的時候,會不會出現阻塞,導致服務端沒有驗證完,客戶端就已經出結果上報了。這種情況應該怎么處理。

 

5.戰斗系統。

玩法上是這樣,首先玩家在主場景的兵營擺放兵的陣型。3*5個位置。進入戰斗場景之后,隔15秒出一波兵,此時玩家無法操作。

其實是模仿皇室戰爭,但是去掉了手動的操作。玩法好不好我不想討論。商業游戲是為了賺錢,游戲火了才能賺錢。

游戲火不火和玩法好不好沒有正相關的關系。同樣是SLG游戲,有些游戲都沒有戰斗表現,全部是數值,一樣是流水不錯。

游戲能不能到達高流水,更大取決於市場和運營的能力和美術風格。玩法上當然是能抄則抄,因為游戲開發需要巨大的成本。

去抄襲一個玩法,比原創一個玩法的成功率高很多。

 

戰斗系統是我全程從無到有寫的邏輯。架構上講,在客戶端模擬了一套戰斗命令隊列。

客戶端戰斗模塊收到服務端下發的戰斗數據和戰斗開始的協議,就開始進行戰斗。

邏輯層會發命令給表現層(場景,對象)進行展現。邏輯層和表現層是分離的,邏輯層驅動表現層。

 

6.地理位置管理(四叉樹)

可以參見我的另一篇 http://www.cnblogs.com/yao2yaoblog/p/5475231.html

 

我從這個游戲只有一個2d模型尋路,到滿屏的對象,特效。

從pve只有一排排整齊的據點,到有雲霧,有副本,各式各樣的據點。

從pvp只有一個列表,到能旋轉的星空,再到位置散列的星球。無論最后結果如何,我都感謝有過這段經歷。

游戲成不成功不是我決定的,我能做的只有把代碼寫好,希望技術更好。能夠理解更深的技術。

 

最近看到了余華的《活着》。生活本來就是個玩笑,怎么可能都如意順心呢。

成年人的生活沒有容易。但行好事莫問前程。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM