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