[Unity 速記] Mirror Networking 多人連線套件簡介與安裝

為甚麼部落格停更了一個多月?因為這陣子我都在閉關修行 (X

免費開源套件 Mirror Networking 是我近期在研究的項目,他是一個取代將被棄用的 UNET 的多人連線套件。而因為我沒接觸過 UNET,所以在這裡也不方便為大家比較兩者之間的差異。但如果依照 Mirror 的文檔說明,貌似可以很輕易的從 UNET 轉換到 Mirror。

Mirror 與我們一般看到的客戶端、伺服器,程式碼各自為政的概念不太一樣。這個套件的客戶端和伺服器的程式碼是寫在一起的!雖然聽朋友說好像有個可以做到完全 Server-Side 用的方法,但我猜這應該需要魔改核心程式,所以就先暫時不接觸。

各位只要理解一件事情,這個連線架構不適合拿來開發公開的 MMORPG、FPS 等遊戲。除了伺服器程式碼會被包在客戶端上之外,Mirror 的連線方式對於超多資料的同步與傳送之效能是不好的,詳細可以看看這篇文章的解析 (英文):The Current State of Unity Networking: A Critique of Mirror

甚麼遊戲適合使用 Mirror?

只要是不會同時有超多人在線的遊戲,或不在意伺服器上的機密參數會被客戶端拆包,甚至像 Minecraft、Unturned 可以讓客戶端自行開設伺服器的項目,都可以使用 Mirror。

開發過程會遇到甚麼問題?

思緒容易打結

如果你像我一樣是第一次接觸多人遊戲開發,那請做好腦袋會打結的心理準備。因為在 Mirror 的架構中,你必須將客戶端與伺服器的程式碼寫在同一個腳本之中,資料量一多很容易搞混之間的關聯性。

所以呢?請養成使用 #region 與寫註解的習慣,能搭配 Git 版控會更好。隨時筆記隨時記錄,讓自己保持意識清醒。

各種判定存在延遲

延遲對於非單機遊戲來說是無法避免的,也是最致命的問題。在伺服器腳本中你必須設下非常多 yield return new Wait…. 之類的延遲判定,否則會出現判定不到物件的尷尬狀況

這有點難說明,所以就舉個例子吧!

假如你要寫一個玩家登入伺服器後,要從預設場景移動至另一個已載入的場景。那你必須在移動玩家物件至場景的程式碼前設下至少 0.2 秒左右的延遲判定,並搭配迴圈的概念來避免延遲過高的狀況。

為甚麼要這樣做?因為你從伺服器要命令客戶端需要時間、載入場景也需要時間。如果沒設定延遲的話,伺服器很容易會在客戶端完成載入場景工作前就命令移動玩家物件,就會導致客戶端找不到目標場景的狀況,然後就死掉了。

另一個例子是最容易聯想的「移動」,玩家在看自己之外玩家的移動時,正常都會有 20~60 毫秒左右的延遲。雖然在正常的狀況下影響不大,但如果網路狀況稍微差時,碰到子彈擊中這種需要非常精準的判定時就容易出 BUG。

說了那麼多,那建議學習 Mirror 嗎?

學啦!哪次不學的!

入門學這個應該是不錯的選擇。至少對我來說,在研究 Mirror 之後,對於遊戲伺服器的邏輯處理方式真的了解了不少 (畢竟寫用 Mirror 的遊戲規模不會太大)。

如何下載與安裝 Mirror?

第一步

Mirror 有上架至 Unity Asset Store,我們可以直接在 Unity 中將他下載並匯入到素材庫中。

254fc90e026fe467b30b757a623b2aa7

第二步

第一次學 Mirror 最快的方式就是看他的範例專案,所以在這邊我們要匯入所有的資料。請全選後按下 Import

35cd8f684ed1d9532337c777374b195f

第三步

匯入完成後我們需要調整一項設定,以確保 Mirror 能正確執行。請從上方選單 Edit 來開啟 Project Settings

ac8ac48d9996191d541528fec4a3bf24

然後切換到 Player 分頁,將 Api Compatibility Level 調整為 .NET 4.x
最後將專案儲存後重開 Unity

d052b932080cd7f1fd4d2d5dc13120f0

第四步

如何確定 Mirror 有安裝好呢?除了看看 Console 有沒有錯誤訊息之外,從上方的 Assets 選單中能找到 Create > Mirror 系列的選項就代表可以開始 Coding 囉!

49bf2bd784222db5f343c8233f132ec3

結語

在這一章節中,我們也算是大致了解 Mirror 是客戶端 & 伺服器寫在一起的架構,也提前看到未來容易會遇到的問題,並將 Mirror 成功安裝至 Unity 當中。之後我將會陸續發表更多關於 Mirror 的開發筆記,為中文語系的 Mirror 參考資料中貢獻一份心力!

最後,如果到目前為止你都很順利,那恭喜你,準備開始燒腦吧 XD

訂閱
Notify of
guest
0 留言
Inline Feedbacks
檢視所有留言