熱門
Unity多人游戲示例《Boss Room》,,為開發(fā)者提供完美學(xué)習(xí)資料
《Boss Room》于2021年4月發(fā)布了搶先體驗版,,是Unity給開發(fā)者鮮活的項目示例,而現(xiàn)在應(yīng)用了更多的Unity Gaming Services(UGS)元素的《Boss Room》更加適用于多人游戲開發(fā)上手學(xué)習(xí),。
作為多人游戲的示例項目,,《Boss Room》在一個可用于實際生產(chǎn)的環(huán)境中展示了各種UGS功能,為多人游戲的開發(fā)提供學(xué)習(xí)資源,。
《Boss Room》有兩個主要用途:
其一是作為一個示范性樣例供社區(qū)用作項目基礎(chǔ),,或作為零部件用在開發(fā)者自己的Unity游戲中。
這也讓開發(fā)者們有機(jī)會親自嘗試自己的解決方案,,與UGS團(tuán)隊攜手合作,,使用Unity提供的SDK來創(chuàng)建并維護(hù)一個具備所有常見功能的多人游戲。隨著Unity不斷加入新的工具和功能,,《Boss Room》也在不斷發(fā)展,、其功能也越來越多。
就在上個月,,《Boss Room》更新了v1.1.0-pre版本,,為多人游戲服務(wù)端的開發(fā)者帶來了一套全新的功能集。
讓玩家聯(lián)手勇闖《Boss Room》
作為一款多人游戲,,《Boss Room》必須得有一個搜索和加入游戲的方式,。
目前,,玩家有兩種方法來搜索并連接到游戲。
IP直連允許玩家使用公開的IP地址相互連接,。不過,,一臺電腦的網(wǎng)絡(luò)通常要經(jīng)由NAT(網(wǎng)絡(luò)地址轉(zhuǎn)換設(shè)備)和路由器轉(zhuǎn)接,因此直接連接到別人的電腦并沒有想象得那么簡單,。
端口轉(zhuǎn)發(fā)(Port forwarding)技術(shù)能讓直連成為可能,,但是主機(jī)方還是需要做一些額外設(shè)置才能讓其他玩家連接。此種解決方案也不具備搜索游戲比賽的功能,,玩家必須通過游戲外的信息分享渠道傳遞相關(guān)加入信息才行,。而它的好處是可以使用局域網(wǎng)運(yùn)行,不需要互聯(lián)網(wǎng)連接,。
像《Boss Room》這種多人游戲必須要能在互聯(lián)網(wǎng)上游玩,、游戲房間必須能被輕松搜索到,不可以強(qiáng)行讓玩家自己完成端口轉(zhuǎn)發(fā),。
那么這時Unity Gaming Services就有用了——Authentication,、Lobby加Relay的組合技可以讓玩家輕松地創(chuàng)建或加入聯(lián)網(wǎng)游戲,不必再依靠端口轉(zhuǎn)發(fā)或游戲外的協(xié)調(diào),。
在Authentication,、Lobby和Relay服務(wù)整合到《Boss Room》之后,游戲的創(chuàng)建和加入會變得更加簡單,,讓端口轉(zhuǎn)發(fā)和分享游戲信息顯得多余,。
總的來說,游戲現(xiàn)在的聯(lián)網(wǎng)體驗更加順暢和迅速,,這一點(diǎn)對樣例項目來說是加分項,,對真正的游戲來說是必須項。
接下來再來看看我們從項目制作中總結(jié)出來的經(jīng)驗吧,!
《Boss Room》開發(fā)流程概覽
從游戲體驗來看,,《Boss Room》是一個功能齊全、主機(jī)托管的PVE多人合作游戲RPG,,支持最多8名玩家——詳細(xì)的游戲功能和玩法可以在此處了解,。
第一步:Authentication,、UGS及本地迭代的流程
玩家要想使用其他的Unity Gaming Services服務(wù),,就必須經(jīng)過身份驗證,所以游戲在啟動并加載完主菜單之后便會啟動Authentication,。
Authentication支持匿名登錄,,玩家不需要輸入額外的信息即可開始游戲。
Authentication API默認(rèn)不會區(qū)分同一臺設(shè)備的多個游戲?qū)嵗?,即便玩家打開了多個游戲進(jìn)程,,游戲登陸的仍是同一個賬戶,。這點(diǎn)給本地的游戲測試帶來了困難——ParrelSync克隆出來的和實際的游戲都受到了影響。
幸而這里有一個簡單的解決方案:Authentication支持Profiles玩家檔案,,它正是解決問題的關(guān)鍵所在,。Profiles可以有效地讓多名玩家同時在一臺設(shè)備上進(jìn)行游戲。要在本地進(jìn)行測試,,我們需要讓正式版和編輯器版能在多個Profile間自由切換,。
如果要創(chuàng)建玩家檔案,你需要根據(jù)ProfileManager類來決定使用哪一類Profile,。在正式版里我們使用的是`-AuthProfile`命令行參數(shù)來指定新檔ID,。在編輯器中迭代時,我們用到了ParrelSync,,ProfileManager類同樣支持用ParrelSync的`CloneManager`自定義參數(shù)來指定玩家檔案的類型,。
我們還使用了`ProfileManager.Profile`來生成自定義的`InitializationOptions`。
在上述任務(wù)完成后,,我們就可以啟動其他服務(wù)了,,并且我們用了某種方法自動化了ParrelSync和Profile的本地迭代流程。在《Boss Room》中已經(jīng)把這一點(diǎn)改為基于dataPath,,以減少對工具的束縛,,但上述解決方案對ParrelSync用戶仍然有效。
創(chuàng)建房間:建立主機(jī)的流程
玩家若想創(chuàng)建主機(jī),,可以輸入游戲房間的名稱,、設(shè)定開放或加密房間,然后點(diǎn)擊“create”按鈕,。
創(chuàng)建房間的API這時就會被調(diào)用,。新建的游戲房間會進(jìn)入**locked**狀態(tài)(區(qū)別于已經(jīng)設(shè)置完畢并開放的游戲房間),直到系統(tǒng)成功完成下方分配中繼網(wǎng)絡(luò)和啟動網(wǎng)碼傳輸?shù)牟襟E:
主機(jī)向Relay請求分配中繼網(wǎng)絡(luò)
UTP被啟動,,主機(jī)將進(jìn)入角色選擇場景房間解除鎖定狀態(tài),,讓其他客戶端可以自由加入。
加入游戲房間:客戶端聯(lián)網(wǎng)的流程
有幾種加入游戲房間的方式:
連接到Lobby服務(wù)上托管的公開房間
快速加入(Quickjoin),,隨機(jī)加入一個公開房間
使用密碼加入,,密碼可在游戲外分享。這些方式對公開和私人房間都適用,。
在加入一個房間后,,我們將使用房間元數(shù)據(jù)中所包含的中繼網(wǎng)絡(luò)入場碼,通過UTP Relay傳輸網(wǎng)絡(luò)連接到主機(jī),。
主機(jī)將收到客戶端的連接請求,,如果一切順利,玩家將依照服務(wù)器(主機(jī))的權(quán)威跳入恰當(dāng)?shù)膱鼍啊?/p>
玩家創(chuàng)建或加入游戲之后
在建立連接后,,玩家將進(jìn)入角色選擇場景,,從八名英雄中選擇一名,。在所有玩家準(zhǔn)備完畢后,每一位英雄會在倒計時結(jié)束后被傳送至《Boss Room》世界,,正式開始游戲,。
注意,UGS Lobby和我們游戲中的“l(fā)obby”,,也就是角色選擇場景并不是一回事,。《Boss Room》的角色選擇場景由netcode驅(qū)動,。
需要強(qiáng)調(diào)的是,,Lobby服務(wù)可以傳輸任意元數(shù)據(jù),因此同樣的角色選擇場景完全可以應(yīng)用到其他游戲中,。
目前,,Lobby服務(wù)通過輪詢(poll)來更新狀態(tài),這不利于提高選擇角色時的響應(yīng)性,,如果Lobby服務(wù)在未來推出了可以實時更新的功能,,那么該方法可以用作一種可行的備用方案。
斷開連接和重新連接的處理
多人游戲的斷線重連功能非常重要,。
《Boss Room》使用的游戲進(jìn)程管理系統(tǒng)可以在某位玩家斷開連接時保留部分?jǐn)?shù)據(jù),,在重新連上后再精確地傳回去。
我們使用的重連數(shù)據(jù)恢復(fù)方法可以在SessionManager.cs - SetupConnectingPlayerSessionData 中找到,,該類會在主機(jī)處理連接批準(zhǔn)時被調(diào)用,。
在房間內(nèi)游戲時,斷開連接的玩家超好能立即被移除,。否則,,服務(wù)器將一直認(rèn)為玩家還在房間中,導(dǎo)致玩家無法重新加入,。
當(dāng)玩家斷開了與Relay的連接時,,Lobby和Relay集成系統(tǒng)(在運(yùn)行UTP連接之前已經(jīng)啟用)會踢出斷開連接的玩家,然而斷開連接的狀態(tài)會持續(xù)相當(dāng)長時間(約為2分鐘),,因此我們不能僅依賴這種機(jī)制,。
為了使退出房間的過程更加可靠,我們應(yīng)用了幾個額外的清理機(jī)制:
客戶端包含有退出應(yīng)用的邏輯,,可以發(fā)送請求來將玩家移除
主機(jī)有著專門的清理邏輯,,如果有玩家斷開連接,則主機(jī)就會把這名玩家從房間中移除(通過調(diào)用`NetworkManager.OnClientDisconnectCallback`)——這在客戶端崩潰并且無法發(fā)送“退出房間”的請求時非常有用,。為了做到這點(diǎn),,主機(jī)會用SessionManager來保存與NGO clientId對應(yīng)的UGS playerId。
最后,,客戶端還包含了檢測主機(jī)是否已離開房間的檢測邏輯,,如果主機(jī)離開了房間,則客戶端也會離開,。
電話:010-50951355 傳真:010-50951352 郵箱:[email protected] ,;點(diǎn)擊查看區(qū)域負(fù)責(zé)人電話
手機(jī):13811546370 / 13720091697 / 13720096040 / 13811548270 /
13811981522 / 18600440988 /13810279720 /13581546145