[Unity Mirror] FAQ
如何發(fā)送/同步自定義數(shù)據(jù)類(lèi)型?
? Mirror 可以在編譯腳本時(shí)自動(dòng)為許多自定義數(shù)據(jù)類(lèi)型創(chuàng)建序列化函數(shù)。
? 例如,mirror 會(huì)自動(dòng)為 MyCustomStruct 創(chuàng)建一個(gè)函數(shù),以便無(wú)需任何額外工作即可發(fā)送它。
[ClientRpc] public void RpcDoSomething(MyCustomStruct data) {// do stuff here }struct MyCustomStruct {int someNumber;Vector3 somePosition; }更多細(xì)節(jié)
- Data Types
- Serialization
如何連接到另一個(gè) Mirror 實(shí)例?
到同一設(shè)備上的另一個(gè)實(shí)例
? 確保您連接到“l(fā)ocalhost”。本地主機(jī)基本上意味著“本地主機(jī)”,即您的本地機(jī)器。
? 確保 NetworkManager 上的網(wǎng)絡(luò)地址字段設(shè)置為“l(fā)ocalhost”,或者如果使用 NetworkManagerHUD,則文本框?yàn)椤發(fā)ocalhost”。確保不包括引號(hào)。
? 請(qǐng)注意,這不適用于移動(dòng)設(shè)備,因?yàn)?iOS 或 Android 都不支持并排運(yùn)行同一應(yīng)用程序的兩個(gè)實(shí)例。這更適合桌面測(cè)試和開(kāi)發(fā)使用。
到同一網(wǎng)絡(luò) (LAN) 上的另一個(gè)實(shí)例
? 確保 NetworkManager 上的網(wǎng)絡(luò)地址字段設(shè)置為主機(jī)的 LAN IP,或者如果使用 NetworkManagerHUD,則將文本框設(shè)置為主機(jī)的 LAN IP。
? 例如,正確的設(shè)置是“192.168.8.100”、“10.0.0.100”、“172.16.42.69”
例如,不正確的設(shè)置是“l(fā)ocalhost”或“203.200.110.100”
? 在某些情況下,您可能需要額外的步驟,請(qǐng)查看以下內(nèi)容
? 要在 Windows 上檢查 LAN IP,您可以打開(kāi) PowerShell/命令提示符并使用 ipconfig 命令,然后在當(dāng)前適配器(以太網(wǎng)/wifi/等)下查找 IPv4 地址條目,如下所示:
IPv4 Address. . . . . . . . . . . : 192.168.x.x
? 在 Mac OS 上,您可以在設(shè)置應(yīng)用程序中使用網(wǎng)絡(luò)設(shè)置,而在 Linux 上,您可以使用 ifconfig、ip addr 或像 NetworkManager 或 wicd 這樣的 GUI 來(lái)獲取您的 LAN IP,具體取決于您是在運(yùn)行桌面環(huán)境還是在命令行。
到另一個(gè)實(shí)例 (Internet/WAN)
? 將 networkAddress 字段設(shè)置為主機(jī)的 IP 地址(google ‘whats my IP’)
本節(jié)不包括中繼、專(zhuān)用 VPS 或Headless 功能。
? 為此,您需要執(zhí)行以下一些操作,其中大部分取決于您的設(shè)置和路由器:
- 轉(zhuǎn)發(fā)端口:
- 確保您的 ISP 允許您在自己的連接上托管服務(wù)器,一些 ISP 不允許這樣做并且會(huì)過(guò)濾傳入連接。如有疑問(wèn),請(qǐng)咨詢(xún)您的 ISP。知識(shí)就是力量。
- 確保您的 ISP 允許您更改路由器上的設(shè)置。有些可能非常嚴(yán)格并重置您隨機(jī)更改的設(shè)置。
- 將您的游戲端口(默認(rèn)為 7777)轉(zhuǎn)發(fā)到 PC 的本地 IP,例如 192.168.1.20。確保您指定了正確的協(xié)議,如果您將其設(shè)置為僅接受傳入的 TCP 連接,傳入的 UDP 連接將不起作用,反之亦然。如果你的路由器支持,你可以使用“BOTH”設(shè)置來(lái)繞過(guò)這個(gè)頭疼的問(wèn)題;或者
- 拉一個(gè)快速(但不太安全)的技巧將本地 IP 添加到路由器的 DMZ 以采取絕望的措施。
DMZ 可能是一個(gè)非常有用的工具,但請(qǐng)注意:能力越大,責(zé)任越大!
具有您指定的 IP 地址的計(jì)算機(jī)將在 Internet 上公開(kāi),而路由器防火墻不會(huì)過(guò)濾不良的入站流量。這意味著,如果您正在運(yùn)行任何私有 Web 服務(wù)器或應(yīng)用程序,您可能會(huì)受到位于 Internet 上其他位置的其他人的入侵。
如果您運(yùn)行的是未打補(bǔ)丁的操作系統(tǒng)(例如,舊版本的 Microsoft Windows)或您的計(jì)算機(jī)安全受到威脅,請(qǐng)勿使用此 DMZ 選項(xiàng)。在使用 DMZ 設(shè)置之前,請(qǐng)確保您的安全已啟用并且您的防病毒/反惡意軟件已完全更新。
- 電腦防火墻:
- 您可以將其關(guān)閉以進(jìn)行快速測(cè)試,以查看您的防火墻是否令人討厭。確保稍后重新打開(kāi)它。
- 手動(dòng)允許編輯器和您在防火墻設(shè)置中創(chuàng)建的任何構(gòu)建。
- 嘗試從Build而不是 Unity 編輯器,因?yàn)橛袝r(shí) Unity 編輯器可能會(huì)很卡。
- 一些防病毒/移動(dòng)設(shè)備可能有額外的阻止層:
- 如果可以,請(qǐng)嘗試關(guān)閉它們以進(jìn)行快速測(cè)試。確保稍后重新打開(kāi)它。
- 在極少數(shù)情況下,ISP 或公司/學(xué)校會(huì)阻止端口和連接,這很難自行調(diào)整。
? 如果您需要更多幫助,最好在谷歌上搜索您的設(shè)置和路由器指南。一個(gè)可靠的替代方案是使用專(zhuān)用服務(wù)器/VPS 或使用中繼。
主機(jī)遷移
主機(jī)遷移替代方案和解決方法。
? 在撰寫(xiě)本文時(shí),主機(jī)遷移并未內(nèi)置在 Mirror 中,如果可以的話(huà),最好完全避免主機(jī)遷移。下面是一些關(guān)于為什么以及如何添加類(lèi)似主機(jī)遷移的替代方案的提示。
- 如果您正在做需要保持開(kāi)放的游戲,例如 MMO,專(zhuān)用主機(jī)應(yīng)該很少關(guān)閉。
- 簡(jiǎn)短的競(jìng)技場(chǎng)地圖,將玩家?guī)Щ赜螒蛄斜?匹配器,這樣他們就可以加入另一個(gè),漂亮而簡(jiǎn)單。
? 解決方法基本上是偽造主機(jī)遷移,將備份主機(jī)的信息存儲(chǔ)在玩家游戲中,斷開(kāi)連接后,將游戲中的每個(gè)人重新連接到該新主機(jī),然后將位置和變量數(shù)據(jù)恢復(fù)到原始主機(jī)消失之前的狀態(tài)。
- 在玩家加入時(shí)測(cè)試他們的連接,找到一個(gè)端口暢通且 ping/延遲不錯(cuò)的連接。
- 在所有連接的玩家游戲中發(fā)送此玩家數(shù)據(jù)(IP 和端口)。
- 在本地或備份主機(jī)上保存各種玩家信息,例如玩家位置、健康狀況等。
- 與服務(wù)器斷開(kāi)連接后,調(diào)用函數(shù)連接到備份主機(jī)。例如,StartClient( BackupIP - BackupPort )
- 由于場(chǎng)景很可能會(huì)隨著玩家重新生成而重置,因此您現(xiàn)在需要將玩家位置設(shè)置回您存儲(chǔ)的位置,該位置通過(guò)檢查點(diǎn)或在斷開(kāi)連接檢測(cè)回調(diào)中保存。
- 用 UI 覆蓋所有這些,說(shuō)請(qǐng)稍候(可選,應(yīng)該在眨眼間發(fā)生)。
根據(jù)您的游戲情況,添加變通方法可能容易或困難。其中的一個(gè)例子是:
- (更簡(jiǎn)單)只需要玩家位置數(shù)據(jù)的游戲,例如“Fall Guys”。
- (困難)帝國(guó)鍛造,一個(gè)放置創(chuàng)建對(duì)象的游戲,士兵,車(chē)輛,各種其他工藝和升級(jí),都有自己的等級(jí)/統(tǒng)計(jì)數(shù)據(jù)。
主服務(wù)器/列表服務(wù)器和簡(jiǎn)單的匹配器
全球注冊(cè)主機(jī)數(shù)據(jù)的數(shù)據(jù)庫(kù)
? 所有主機(jī),專(zhuān)用主機(jī)或玩家主機(jī),都被添加到列表數(shù)據(jù)庫(kù)中,玩家獲取列表并可以選擇加入誰(shuí)。使用列表服務(wù)器意味著玩家不必手動(dòng)輸入 IP 地址和端口,這一切都在幕后完成,適用于 localhost、LAN 和 WAN 連接類(lèi)型。您可以向玩家顯示盡可能多或盡可能少的數(shù)據(jù),例如主機(jī)名、類(lèi)型(死亡競(jìng)賽)、玩家數(shù)量(45 / 50)、ping、敵人難度、地圖、區(qū)域等。
-
Node ListServer:免費(fèi),但您自己將文件托管在未受阻的 PC 上,例如 VPS。具有多種可定制功能,如果您想要自托管專(zhuān)用游戲,是最佳選擇。
-
Light Reflective Mirror:這是一個(gè)列表服務(wù)器和一個(gè)中繼,它是免費(fèi)的,但您自己托管和管理文件。中繼提供暢通的流量路由,但代價(jià)是額外的延遲/增加的 ping。此中繼將首先測(cè)試直接連接,如果失敗則回退到路由流量。列表服務(wù)器和中繼流量都是可選的,您可以使用其中的一部分,而不能使用另一部分。這是玩家托管游戲的最佳選擇,其中路由器端口塊很常見(jiàn)。
-
Epic 和 Steam,這些都是為您托管的。
查看 Discords 插件和傳輸部分以獲取更多信息,以及其他未列出的配對(duì)和列表服務(wù)器方式。
簡(jiǎn)單的匹配器
- 你可以把這些列表服務(wù)器做成匹配器,簡(jiǎn)單地把列表隱藏給玩家,讓他們自動(dòng)加入一個(gè)有空間的游戲。你也可以過(guò)濾掉玩家設(shè)置的各種要求,例如,只限于 "美國(guó) "地區(qū),或 "熔巖島 "地圖。
如何獲取玩家數(shù)量?
有幾種方法可以做到這一點(diǎn),每種方法都有自己獨(dú)特的好處。
NetworkServer.connections.Count
- 套接字連接,包括沒(méi)有生成prefab、未經(jīng)過(guò)身份驗(yàn)證的人,或者可能在生成過(guò)程中出錯(cuò)但臨時(shí)連接的人(Android 用戶(hù)最小化游戲)。只有主機(jī)/服務(wù)器可以檢查這個(gè)。
NetworkManager.singleton.numPlayers
- 服務(wù)器上活躍已經(jīng)生成的玩家對(duì)象的數(shù)量(只有主機(jī)/服務(wù)器可以檢查這個(gè))
按GameObject Tag查找
- 在客戶(hù)端工作,不需要網(wǎng)絡(luò)代碼,并且是區(qū)分玩家狀態(tài)的好方法,通過(guò)在某些情況下應(yīng)用游戲?qū)ο髽?biāo)簽,例如,“未準(zhǔn)備好/默認(rèn)”、“死亡”、“觀眾”。
總結(jié)
以上是生活随笔為你收集整理的[Unity Mirror] FAQ的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 数据可视化图表插件_7个最佳数据可视化W
- 下一篇: 制作一个浪漫温馨的生日礼物送她~html