Unity多人同時在線海量玩家角色的架構(gòu)與設(shè)計
前言
Unity多人同時在線的游戲會有很大的地圖,大量的玩家同時在線,以及玩家會有不同的游戲職業(yè),這樣眾多的玩家游戲角色我們客戶端應(yīng)該如何來設(shè)計呢?本文來分享以下幾個點:
(1) 每個網(wǎng)絡(luò)玩家角色是一個GhostCharactor;
(2) 網(wǎng)絡(luò)玩家角色的創(chuàng)建與刪除,由GhostEntityMgr統(tǒng)一管理;
(3) 網(wǎng)絡(luò)玩家的性能優(yōu)化要注意的事項;
每個網(wǎng)絡(luò)玩家角色是一個GhostCharactor
多人同時在線(2000+玩家在同一個地圖上游戲)的網(wǎng)絡(luò)游戲,我們都是基于狀態(tài)同步來進行處理的,這類游戲中的玩家我們可以分成兩類: 一類是其它玩家通過網(wǎng)絡(luò)控制的角色,一類是當(dāng)前玩家控制的角色(我們稱self玩家)。我們做多人同時在線的游戲都是基于狀態(tài)同步,即在服務(wù)器上會跑一個完整游戲邏輯,然后有狀態(tài)改變了,就發(fā)送”最新的狀態(tài)”給能看見這個玩家的其它網(wǎng)路網(wǎng)絡(luò)玩家??蛻舳耸盏阶钚聽顟B(tài)的數(shù)據(jù)包后,根據(jù)數(shù)據(jù)包的內(nèi)容來做對應(yīng)的動作與處理,比如收到死亡的狀態(tài)事件,播放死亡動畫等。也就是說所有的角色,最終都是通過服務(wù)端發(fā)送過來的網(wǎng)絡(luò)事件來驅(qū)動的。一個網(wǎng)絡(luò)游戲角色,其實就是一個基于網(wǎng)絡(luò)事件驅(qū)動的角色鏡像(下文我們稱ghost)。
Ghost負責(zé)處理各種網(wǎng)絡(luò)事件,然后根據(jù)網(wǎng)絡(luò)事件來實現(xiàn)對應(yīng)事件的處理邏輯。所以我們在設(shè)計的時候編寫一個GhostCharactor的對象組件,用來專門響應(yīng)和處理網(wǎng)絡(luò)角色對應(yīng)的網(wǎng)絡(luò)事件, GhostCharactor再調(diào)用對應(yīng)的功能組件,完成特定的功能。所以成千上萬的游戲玩家對象都可以使用GhostCharactor來根據(jù)網(wǎng)絡(luò)事件來控制客戶端本地角色同步狀態(tài)與展示動畫。玩家自己的角色對象也可以是一個GhostCharactor。
大量玩家角色的創(chuàng)建與刪除,由GhostEntityMgr統(tǒng)一管理
上面分析了多人同時在線游戲中的每個角色都可以用GhostCharactor來做控制,那么這些角色都可以通過GhostEntityMgr管理對象來進行構(gòu)建與回收。多人游戲同時在線的時候,會有大量的玩家創(chuàng)建與刪除,這個時候我們使用GhostEntityMgr,來做內(nèi)存池來進行網(wǎng)絡(luò)游戲角色的創(chuàng)建與刪除。
創(chuàng)建一個網(wǎng)絡(luò)玩家角色需要實現(xiàn)以下幾個點:
a: 玩家角色的節(jié)點創(chuàng)建, 根據(jù)玩家的職業(yè),來選擇要創(chuàng)建的游戲角色預(yù)制體來實例化角色;
b: 創(chuàng)建一個GhostCharactor組件對象到玩家角色節(jié)點上,實現(xiàn)所有網(wǎng)絡(luò)游戲角色的事件處理邏輯;
c: 在GhostCharactor里面把一些功能性的組件都添加到玩家節(jié)點上:技能攻擊,導(dǎo)航組件等。GhostCharactor來調(diào)用這些功能組件來完成特定的功能;
d: 客戶端GhostCharactor統(tǒng)一處理服務(wù)器發(fā)過來的對應(yīng)角色的網(wǎng)絡(luò)事件;
e: 對于是本機玩家操作的網(wǎng)絡(luò)角色, GhostEntityMgr除了給這個節(jié)點添加GhostCharactor以外還會添加玩家操作組件PlayerOpt,主要是將玩家的操作發(fā)送給服務(wù)器。服務(wù)器接收到事件后,計算最新的狀態(tài),把改變的狀態(tài)通知給對它感興趣的客戶端。
f: GhostCharactor設(shè)計一個保存玩家的游戲數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu),比如hp, attack等,
看下整個架構(gòu)圖,如下:

網(wǎng)絡(luò)玩家性能優(yōu)化注意的一些事項
Unity客戶端做多人網(wǎng)絡(luò)在線的時候,我們優(yōu)化的時需要注意以下幾個點:
a:?內(nèi)存池來管理玩家對象;
由于MMORPG等多人同時在線的游戲都會有AOI的區(qū)域,就會頻繁有網(wǎng)絡(luò)玩家進入AOI區(qū)域與離開AOI區(qū)域,這樣就會導(dǎo)致在客戶端頻繁的創(chuàng)建與刪除一個網(wǎng)絡(luò)玩家對象節(jié)點,所以一般我們會基于內(nèi)存池來管理玩家對象,這樣讓玩家對象能快速的創(chuàng)建與刪除。
b:?玩家的血條昵稱等UI元素優(yōu)化
注意一下玩家的UI元素的drawcall,同時把UI元素盡可能的合批降低drawcall,同時血條與玩家昵稱會改變,所以最好角色UI元素放在單獨的一個Canvas下。
c:?角色的動畫盡量使用Animator動畫狀態(tài)機來做
新版的角色動畫狀態(tài)機Animator內(nèi)部能發(fā)揮多線程優(yōu)勢,比Animation性能更好,所以做角色的時候盡量使用Animator來做動畫狀態(tài)機,播放動畫與動畫切換。
d:?發(fā)送給服務(wù)器的數(shù)據(jù)先在本地做好校驗數(shù)據(jù)合法性校驗,再發(fā)往服務(wù)器。
游戲程序運行中得到的發(fā)送給服務(wù)器的數(shù)據(jù)可能并不符合要求,作為客戶端,發(fā)送數(shù)據(jù)給服務(wù)端之前盡量的保證數(shù)據(jù)的合法性,避免去沖擊服務(wù)器,雖然服務(wù)器也要校驗。
e:?戰(zhàn)斗過程中做好日志與錄像,方便bug追蹤與分析。
大型多人同時在線的游戲會有大量的玩家創(chuàng)建與刪除,同時有大量的數(shù)據(jù)過來,我們在處理網(wǎng)絡(luò)數(shù)據(jù)的時候要做好狀態(tài)的日志,方便我們分析。
f:?根據(jù)手機設(shè)備的高中低端,針對性能來對渲染效果進行定制。
獲取當(dāng)前的手機的機型,判斷屬于哪類機器,根據(jù)機器的高中低分類來決定哪些特效與陰影等細節(jié)是否顯示出來,最大限度的保持游戲的流暢性。
還有其它的優(yōu)化的事項,根據(jù)具體實際項目中的問題來進行分析與優(yōu)化。
本節(jié)的內(nèi)容就分享到這里了,關(guān)注我,學(xué)習(xí)更多的網(wǎng)絡(luò)游戲開發(fā)的知識。
附:視頻教程?
https://www.bycwedu.com/promotion_channels/829468798