日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Photon多人游戏开发教程

發(fā)布時(shí)間:2024/8/26 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Photon多人游戏开发教程 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

PUN介紹

入門

Photon Unity Networking(首字母縮寫PUN)是一個(gè)Unity多人游戲插件包。它提供了身份驗(yàn)證選項(xiàng)、匹配,以及快速、可靠的通過我們的Photon后端實(shí)現(xiàn)的游戲內(nèi)通信。

PUN輸出幾乎所有Unity支持的平臺(tái),且有兩種選項(xiàng):
?


注意:對(duì)于Unity 5,兩個(gè)PUN插件包都含相同的文件。你可以買PUN+ 來獲得60個(gè)月的100 CCU,但客戶端上仍使用PUN Free。

PUN、PUN+和UNet的對(duì)比
?


一些必須的代碼

要充分使用PUN,你將需要寫一些腳本。本頁向你展示入門的最重要部分。

你也應(yīng)該花一些時(shí)間來通過Marco Polo Tutorial。

連接

C#代碼示例:
?

PhotonNetwork.ConnectUsingSettings("v4.2");


上面的代碼是你需要連接并開始使用Photon功能的所有代碼。

ConnectUsingSettings?設(shè)置你的客戶端的游戲版本并使用一個(gè)由PUN設(shè)置向?qū)懭氲呐渲梦募?#xff0c;該配置文件保存在PhotonServerSettings里面。

匹配

接下來,你想加入現(xiàn)有的房間或創(chuàng)建自己的。下面的代碼顯示了啟動(dòng)或加入游戲的可能方法調(diào)用。
?

//加入名為"someRoom"的房間
PhotonNetwork.JoinRoom("someRoom");
//如果沒有開放的游戲就會(huì)失敗。錯(cuò)誤回調(diào): OnPhotonJoinRoomFailed
??
//嘗試加入任何隨機(jī)游戲:
PhotonNetwork.JoinRandomRoom();
//如果沒有開放的游戲就會(huì)失敗。錯(cuò)誤回調(diào): OnPhotonRandomJoinFailed
??
//創(chuàng)建名為"MyMatch"的房間。
PhotonNetwork.CreateRoom("MyMatch");
//如果名為"MyMatch"的房間已存在就會(huì)失敗并調(diào)用:OnPhotonCreateRoomFailed


好朋友常常想要一起玩游戲。如果他們可以交流(例如 使用Photon Chat, Facebook), 他們可以瞎編一個(gè)房間名并使用JoinOrCreateRoom方法。因?yàn)樗麄冎婪块g的名字,他們可以創(chuàng)建為他人不可見,像這樣:

C#代碼示例:
?

? ?? ???RoomOptions roomOptions = new RoomOptions() { isVisible = false, maxPlayers = 4 };
? ?? ???PhotonNetwork.JoinOrCreateRoom(nameEveryFriendKnows, roomOptions, ? TypedLobby.Default);


使用?JoinOrCreateRoom方法,如果房間不存在就會(huì)創(chuàng)建該房間。如果房間滿了,?OnPhotonJoinRoomFailed會(huì)被調(diào)用 (如果你在某個(gè)地方實(shí)現(xiàn)了這個(gè)回調(diào)函數(shù))。

游戲

GameObjects可以被實(shí)例化為"networked GameObjects"。它們會(huì)有一個(gè)可以被識(shí)別的PhotonView組件和一個(gè)所有者(或控制者)。所有者會(huì)更新其他人。持續(xù)更新可以通過拖拽一個(gè)腳本到一個(gè)PhotonView的 Observed字段被發(fā)送。需要更新的腳本必須實(shí)現(xiàn)OnPhotonSerializeView像這樣:
?

// 在一個(gè)"observed"[ "observed",被觀察的。] 腳本里:
public void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info)
{
? ?? ?if (stream.isWriting)
? ?? ?{
? ?? ?? ??Vector3 pos = transform.localPosition;? ?? ?? ? stream.Serialize(ref pos);
? ?? ?}
? ?? ?else
? ?? ?{
? ?? ?? ? Vector3 pos = Vector3.zero;
? ?? ?? ? stream.Serialize(ref pos);??// pos被填充。必須在某個(gè)地方使用
? ?? ?}
}
客戶端可以為不見用的操作執(zhí)行Remote Procedure Calls:
// 定義一個(gè)可以被其他客戶端調(diào)用的方法:
[PunRPC]
public void OnAwakeRPC(byte myParameter)
{
? ?? ? //Debug.Log("RPC: 'OnAwakeRPC' Parameter: " + myParameter + " PhotonView: " + this.photonView);
}
// [...]
// 在別的某個(gè)地方調(diào)用該RPC
photonView.RPC("OnAwakeRPC", PhotonTargets.All, (byte)1);


獨(dú)立于GameObjects, 你也可以發(fā)送你自己的事件:
?

PhotonNetwork.RaiseEvent((byte)eventCode, (object)eventContent,(bool)sendReliable, (RaiseEventOptions)options)


初始設(shè)置

Photon Unity Networking (PUN)真的很容易設(shè)置。把PUN導(dǎo)入到一個(gè)新的項(xiàng)目中,然后PUN設(shè)置向?qū)Ь蜁?huì)彈出來,如圖0-1所示。通過輸入一個(gè)郵箱地址來注冊(cè)一個(gè)新的(免費(fèi)) Photon Cloud帳號(hào),或者復(fù)制粘貼一個(gè)已有的AppId到該字段里。打完收工。

如果你想要自己托管一個(gè)Photon服務(wù)器,點(diǎn)擊"skip",然后像如下描述的那樣編輯?PhotonServerSettings
?

圖 0-1 PUN設(shè)置向?qū)?/span>


要連接,你只需在你的代碼中調(diào)用PhotonNetwork.ConnectUsingSettings()。如果你需要更多的控制,詳見下面的?Connect Manually。

Photon服務(wù)器設(shè)置

設(shè)置向?qū)?huì)添加一個(gè)PhotonServerSettings文件到你的項(xiàng)目,用來保存配置。如圖0-2所示,這也是去編輯服務(wù)器設(shè)置的地方。
?

圖 0-2 PhotonServerSetting文件屬性


你可以設(shè)置AppId、Photon Cloud Region和更多的。你的客戶端的Game Version是在代碼里被設(shè)置的。

要選擇的最重要的選項(xiàng)是托管類型。

托管類型

通過Hosting Type你選擇處理你游戲的服務(wù)器和其他配置。

Photon CloudBest Region都涉及到我們管理的云服務(wù)。您可以選擇特定區(qū)域,也可以讓客戶選擇最佳ping區(qū)域。

如果你想在別的地方運(yùn)行Photon服務(wù)器,選擇Self Hosted。安裝程序如下。

或者,你的客戶可以在脫機(jī)模式。

最佳托管區(qū)域

最佳區(qū)域模式將在應(yīng)用首次啟動(dòng)的時(shí)候ping所有已知區(qū)域。由于這需要一點(diǎn)時(shí)間,結(jié)果被存儲(chǔ)在PlayerPrefs。這會(huì)加快連接時(shí)間。

你可以設(shè)置哪些區(qū)域可以忽略。在更少的區(qū)域分發(fā)客戶端會(huì)導(dǎo)致剩余區(qū)域的玩家更多。這在游戲流行之前是有益的。

使用PhotonNetwork.OverrideBestCloudServer()來定義要使用的另一個(gè)區(qū)域。

自托管

如果你為iOS開發(fā)游戲可以考慮閱讀 PUN and IPv6和how to setup Photon Server for IPv6。

如果你要自己托管一個(gè)Photon服務(wù)器,你應(yīng)在PhotonServerSettings里面設(shè)置好它的地址和端口。當(dāng)這些都被正確設(shè)置了,你可以在你的代碼里調(diào)用PhotonNetwork.ConnectUsingSettings()

確保您的客戶端可以到達(dá)輸入的地址。它可以是一個(gè)公共的、靜態(tài)的IP地址、主機(jī)名或在你的客戶端也使用的網(wǎng)絡(luò)中的任何地址。

端口取決于所選協(xié)議,所以請(qǐng)確保這兩個(gè)字段匹配。清除該字段會(huì)將其重置為默認(rèn)端口。

協(xié)議

這里默認(rèn)是(可靠的)UDP,但Photon還支持使用TCP以及將允許一個(gè)可靠的HTTP協(xié)議。

我們建議你堅(jiān)持UDP。PUN+不支持TCP。WebGL導(dǎo)出只能使用WebSockets。

客戶端設(shè)置

客戶端設(shè)置部分包含了每個(gè)項(xiàng)目應(yīng)設(shè)置的幾個(gè)選項(xiàng)。

當(dāng)你勾選Auto-Join Lobby時(shí),PUN將在連接(或離開房間)時(shí)自動(dòng)加入默認(rèn)大廳。Photon的大廳提供當(dāng)前房間的列表,這樣玩家可以選擇一個(gè)加入。這個(gè)默認(rèn)是關(guān)閉的,因?yàn)楦玫倪x擇是使用隨機(jī)匹配,就像所有的演示案例中使用的那樣。

啟用Enable Lobby Stats來從服務(wù)器獲取大廳統(tǒng)計(jì)信息。如果游戲使用多個(gè)大廳,并且你想要向玩家展示每一個(gè)活動(dòng),則這個(gè)統(tǒng)計(jì)信息會(huì)很有用。每個(gè)大廳,你都可以獲取這些屬性: name、type、room和playercount。詳見PhotonNetworking.LobbyStatistics!

這些設(shè)置在PUN v1.60版本引入。

遠(yuǎn)程過程調(diào)用列表

Remote Procedure Calls使你可以在一個(gè)房間里調(diào)用所有客戶端上的方法。PUN 將這些方法的列表保存在PhotonServerSettings。對(duì)于最初的設(shè)置,這是不相關(guān)的。詳見Remote Procedure Calls。

手動(dòng)連接

作為替代自動(dòng)連接的PhotonNetwork.ConnectUsingSettings()方法你可以通過PhotonNetwork.ConnectToMaster()方法來手動(dòng)連接你自己的Photon服務(wù)器。當(dāng)你托管付費(fèi)Photon服務(wù)器時(shí)這是有用的。

對(duì)于ConnectToMaster(),你需要提供一個(gè)masterServerAddress和一個(gè)port參數(shù)。地址可以是你的On-Premises DNS名稱或一個(gè)IP。它可以包括冒號(hào)后的端口(然后傳遞0作為端口)或您可以單獨(dú)通過端口。

ConnectToMaster()方法有更多的另外兩個(gè)參數(shù) : "appID"和"gameVersion"。兩者都只與Photon Cloud有關(guān),并且當(dāng)你自己托管Photon服務(wù)器時(shí),可以設(shè)置為任何值。

對(duì)于Photon Cloud, 使用ConnectUsingSettings()方法。它涉及到我們的Name Server自動(dòng)找到一個(gè)區(qū)域的主服務(wù)器。

功能概述

內(nèi)容提要
?

  • PUN插件
  • 連接和主服務(wù)器
  • 版本控制
  • 創(chuàng)建和加入游戲
  • MonoBehaviour回調(diào)函數(shù)
  • 在游戲房間里發(fā)送消息
  • Photon視圖組件
  • 觀察Transform
  • 觀察MonoBehaviour
  • 遠(yuǎn)程過程調(diào)用
  • RPCs和加載關(guān)卡的時(shí)機(jī)


PUN

當(dāng)你導(dǎo)入PUN時(shí),設(shè)置向?qū)Т翱跁?huì)彈出來。如何設(shè)置請(qǐng)看導(dǎo)入PUN與設(shè)置小節(jié)。

PUN由相當(dāng)多的文件組成, 然而只有一個(gè)是真正重要的:?PhotonNetwork。這個(gè)類包含所有需要的函數(shù)和變量.。如果您有自定義要求,可以隨時(shí)修改源文件。

要從UnityScript中使用PUN,你需要把 "PhotonNetwork"和"UtilityScripts" 文件夾移動(dòng)到AssetsPlugins文件夾。

為了告訴你這個(gè)API如何工作,這里有幾個(gè)例子。

連接

PhotonNetwork始終使用主服務(wù)器和一個(gè)或多個(gè)游戲服務(wù)器。賣二手手機(jī)號(hào)主服務(wù)器管理當(dāng)前可用的游戲并進(jìn)行匹配。一旦房間被發(fā)現(xiàn)或創(chuàng)建,實(shí)際的游戲是在游戲服務(wù)器上完成的。

所有的服務(wù)器都運(yùn)行在專用的機(jī)器上,沒有所謂的玩家托管的服務(wù)器。你不必費(fèi)心記住該服務(wù)器組織,PUN會(huì)為你處理它。

C#代碼示例

PhotonNetwork.ConnectUsingSettings("v1.0");


上面的代碼是你需要連接并開始使用Photon功能的所有代碼。ConnectUsingSettings?設(shè)置你的客戶端的游戲版本并使用一個(gè)由PUN設(shè)置向?qū)懭氲呐渲梦募?#xff0c;該配置文件保存在PhotonServerSettings里面。你也可以修改文件PhotonServerSettings 屬性來連接到你自己的服務(wù)器?;蛘?#xff0c;使用Connect()方法來忽略該P(yáng)hotonServerSettings 文件。

版本控制

Photon的負(fù)載均衡邏輯使用你的AppId來區(qū)分你的和他人的游戲。玩家也會(huì)被游戲版本分開,ConnectUsingSettings的參數(shù)(見上文)。通過這種方式,您可以發(fā)布新功能的客戶端,而不破壞舊版本的游戲。

由于我們不能保證不同PUN的版本之間相互兼容,PUN把它自己的版本號(hào)添加到你的游戲里。更新PUN可能會(huì)從舊的版本中分離出新的客戶端,但不會(huì)打破老客戶端。

創(chuàng)建和加入游戲

接下來,你想加入或創(chuàng)建一個(gè)房間。下面的代碼展示了一些必要的函數(shù):
?

//加入一個(gè)房間
PhotonNetwork.JoinRoom(roomName);??
??
//創(chuàng)建這個(gè)房間。
PhotonNetwork.CreateRoom(roomName);??
// 如果該房間已存在則會(huì)失敗并調(diào)用: OnPhotonCreateGameFailed
??
//嘗試加入任何隨機(jī)游戲:
PhotonNetwork.JoinRandomRoom();??
//如果沒有匹配的游戲則會(huì)失敗并調(diào)用: OnPhotonRandomJoinFailed


在最好的情況下,您的游戲使用隨機(jī)配對(duì)。JoinRandomRoom()將嘗試加入任何房間。如果該方法失敗了(沒有房間接受另一個(gè)玩家),只需創(chuàng)建一個(gè)新的房間,并等到其他玩家隨機(jī)加入它為止。

或者,您的客戶端可以獲得當(dāng)前可用的房間列表。這是通過加入一個(gè)大廳來獲得的。

大廳自動(dòng)發(fā)送他們的房間列表到客戶端,并在時(shí)間間隔內(nèi)更新(從而減少流量)。玩家不會(huì)看到對(duì)方,且無法溝通(以防止當(dāng)您的游戲繁忙時(shí)出問題)。

PhotonNetwork插件可以在其連接時(shí)自動(dòng)加入默認(rèn)大廳。把PhotonServerSettings文件里的"Auto-Join Lobby"屬性開啟即可。

當(dāng)你的客戶端在一個(gè)大廳里時(shí),房間列表會(huì)得到更新, 這些更新會(huì)緩存。如果需要的話,你可以通過GetRoomList方法來每一幀訪問房間列表。

C#代碼示例:
?

foreach (RoomInfo room in PhotonNetwork.GetRoomList())
{
? ?? ?GUILayout.Label(room.name + " " + room.playerCount + "/" + room.maxPlayers);
}


關(guān)于匹配的更多信息請(qǐng)參考Matchmaking And Room Properties。

回調(diào)函數(shù)

PhotonNetwork使用多個(gè)回調(diào)函數(shù)來讓你的游戲知道狀態(tài)的變化,如“已連接”或“已加入一個(gè)游戲”。像往常對(duì)Unity一樣,回調(diào)可在任何腳本里實(shí)現(xiàn)。

如果你的腳本擴(kuò)展Photon.PunBehaviour,?你可以單獨(dú)重寫每個(gè)回調(diào)。在這種情況下,您不必調(diào)用基類實(shí)現(xiàn)。

C#代碼示例:
?

public override void OnJoinedRoom()
{
? ?? ?Debug.Log("OnJoinedRoom() called by PUN: " + PhotonNetwork.room.name);
}


你不需要擴(kuò)展PunBehaviour。如果你在其本身身上實(shí)現(xiàn)它所有的回調(diào)函數(shù)也會(huì)起作用。它們也在枚舉PhotonNetworkingMessage中被列出和描述。

這包括建立游戲房間的基礎(chǔ)知識(shí)。接下來是游戲中的實(shí)際交流。

發(fā)消息

在一個(gè)房間里,你可以發(fā)送網(wǎng)絡(luò)信息給其他連接的玩家。此外,您還可以發(fā)送緩沖消息,也將被發(fā)送到未來連接的玩家(以玩家生成為例)。

發(fā)送消息可以使用兩種方法。無論是RPCs,還是通過在一個(gè)由PhotonView觀察的腳本里實(shí)現(xiàn)OnSerializePhotonView

然而有更多的網(wǎng)絡(luò)互動(dòng)。你可以監(jiān)聽一些網(wǎng)絡(luò)事件的回調(diào)函數(shù),如OnPhotonInstantiateOnPhotonPlayerConnected,并且你可以觸發(fā)其中一些事件,如?PhotonNetwork.Instantiate。如果你被最后一段弄糊涂了,不要擔(dān)心,下一步我們會(huì)為這些主題逐個(gè)做解釋。

Photon視覺同步組件

PhotonView是一個(gè)用于發(fā)送消息(RPCs和OnSerializePhotonView)的腳本組件。你需要將PhotonView依附到游戲?qū)ο蠡蝾A(yù)設(shè)上。請(qǐng)注意,PhotonView和Unity的NetworkView非常相似。

整個(gè)過程,你的游戲中需要至少一個(gè)PhotonView,才能發(fā)送消息和可選的實(shí)例化/分配其他的PhotonViews。

如圖下圖所示,添加一個(gè)PhotonView到一個(gè)游戲?qū)ο?#xff0c;只需選擇一個(gè)游戲?qū)ο蟛⑹褂? "Components/Miscellaneous/Photon View"。
?

圖 0-1 Photon Cloud:Photon View


觀察Transform

如果你將一個(gè)Transform綁定到PhotonView的觀察屬性上,你可以選擇同步位置、旋轉(zhuǎn)和尺度或玩家的這些屬性組合。這可以極大的幫助制作原型或小游戲。注意:任何觀察到的值變化將發(fā)送所有觀察到的值-而不只是發(fā)生變化的那個(gè)單一值。此外,更新的值是不平滑的或插值。

觀察MonoBehaviour

PhotonView可以被設(shè)置來觀察MonoBehaviour。在這種情況下,腳本的OnPhotonSerializeView方法會(huì)被調(diào)用。此方法被調(diào)用來寫入對(duì)象的狀態(tài)并讀取它,這取決于腳本是否由本地玩家控制。

下面簡單的代碼展示了如何用幾行代碼來增加角色狀態(tài)同步:

C#代碼示例:
?

void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info)
{
? ?? ?if (stream.isWriting)
? ?? ?{? ?? ?? ? //我們擁有這個(gè)玩家:把我們的數(shù)據(jù)發(fā)送給別的玩家
? ?? ?? ? stream.SendNext((int)controllerScript._characterState);
? ?? ?? ? stream.SendNext(transform.position);
? ?? ?? ? stream.SendNext(transform.rotation);
? ?? ?}? ?? ?else
? ?? ?{
? ?? ?? ? //網(wǎng)絡(luò)玩家,接收數(shù)據(jù)
? ?? ?? ?controllerScript._characterState = (CharacterState)(int)stream.ReceiveNext();
? ?? ?? ?correctPlayerPos = (Vector3)stream.ReceiveNext();
? ?? ?? ?correctPlayerRot = (Quaternion)stream.ReceiveNext();
? ?? ?}
}


觀察選項(xiàng)

Observe Option字段讓你選擇更新如何發(fā)送以及何時(shí)被發(fā)送。該字段還會(huì)影響到OnPhotonSerializeView被調(diào)用的頻率。

Off 顧名思義,關(guān)掉。如果該P(yáng)hotonView被保留為RPCs限定時(shí)可以很有用。

Unreliable 更新如是被發(fā)送,但可能會(huì)丟失。這個(gè)想法是,下一次更新很快到來,并提供所需的正確的/絕對(duì)的值。這對(duì)于位置和其他絕對(duì)數(shù)據(jù)來說是有利的,但對(duì)于像切換武器這樣觸發(fā)器來說是不好的。當(dāng)用于同步的游戲?qū)ο蟮奈恢?#xff0c;它會(huì)總是發(fā)送更新,即使該游戲?qū)ο笸V惯\(yùn)動(dòng)(這是不好的)。

Unreliable on Change 將檢查每一個(gè)更新的更改。如果所有值與之前發(fā)送的一樣,該更新將作為可靠的被發(fā)送,然后所有者停止發(fā)送更新直到事情再次發(fā)生變化。這對(duì)于那些可能會(huì)停止運(yùn)動(dòng)的以及暫時(shí)不會(huì)創(chuàng)建進(jìn)一步更新的游戲?qū)ο髞碚f是有利的。例如那些在找到自己的位置后就不再移動(dòng)的箱子。

Reliable Delta Compressed 將更新的每個(gè)值與它之前的值進(jìn)行比較。未更改的值將跳過以保持低流量。接收端只需填入先前更新的值。任何你通過OnPhotonSerializeView寫入的都會(huì)自動(dòng)進(jìn)行檢查并以這種方式被壓縮。如果沒有改變,?OnPhotonSerializeView不會(huì)在接收客戶端調(diào)用。該“可靠的”部分需要一些開銷,所以對(duì)于小的更新,應(yīng)該考慮這些開銷。

現(xiàn)在開始,以另一種方式交流:RPCs。

遠(yuǎn)程過程調(diào)用

Remote Procedure Calls (RPC)使你可以調(diào)用"networked GameObjects"上的方法,對(duì)由用戶輸入等觸發(fā)的不常用動(dòng)作很有用。

一個(gè)RPC會(huì)被在同房間里的每個(gè)玩家在相同的游戲?qū)ο?/strong>上被執(zhí)行,所以你可以容易地觸發(fā)整個(gè)場景效果就像你可以修改某些GameObject

作為RPC被調(diào)用的方法必須在一個(gè)帶PhotonView組件的游戲?qū)ο笊稀T摲椒ㄗ陨肀仨氁?/span>[PunRPC]屬性標(biāo)記。
?

[PunRPC]
void ChatMessage(string a, string b)
{
? ?? ?Debug.Log("ChatMessage " + a + " " + b);
}


要調(diào)用該方法,先訪問到目標(biāo)對(duì)象的PhotonView組件。而不是直接調(diào)用目標(biāo)方法,調(diào)用PhotonView.RPC()并提供想要調(diào)用的方法名稱:
?

PhotonView photonView = PhotonView.Get(this);
photonView.RPC("ChatMessage", PhotonTargets.All, "jup", "and jup!");


你可以發(fā)送一系列的參數(shù),但它必須匹配該RPC方法的定義。

這些是最基本的。詳情請(qǐng)閱讀Remote Procedure Calls.

時(shí)機(jī)

RPCs在指定的PhotonViews上被調(diào)用,并總是以接收客戶端上的匹配者為目標(biāo)。如果一個(gè)遠(yuǎn)程客戶端還沒有加載或創(chuàng)建匹配的PhotonView,這個(gè)RPC就會(huì)丟失!

因此,丟失RPCs一個(gè)典型的原因就是當(dāng)客戶端加載新場景的時(shí)候。它只需要一個(gè)已經(jīng)加載有新游戲?qū)ο蟮膱鼍暗目蛻舳?#xff0c;并且其他客戶端不能理解這個(gè)RPC(直到這些客戶端也加載了相同的場景)。

PUN可以幫你解決此問題。只需在你連接之前設(shè)置PhotonNetwork.automaticallySyncScene = true并在房間的主客戶端上使用?PhotonNetwork.LoadLevel()。這樣,一個(gè)客戶端定義了所有客戶端必須在房間/游戲中加載的關(guān)卡。

客戶端可以停止執(zhí)行接收到的消息來防止RPCs丟失(這正是LoadLevel方法幫你做的)。當(dāng)你得到一個(gè)RPC來加載一些場景,立即設(shè)置isMessageQueueRunning = false直到該內(nèi)容被初始化。

例子:
?

private IEnumerator MoveToGameScene()
{
? ?? ?// 加載關(guān)卡前臨時(shí)禁用進(jìn)一步的網(wǎng)絡(luò)信息處理
? ?? ?PhotonNetwork.isMessageQueueRunning = false;
? ?? ?Application.LoadLevel(levelName);
}


禁用消息隊(duì)列將延遲傳入和傳出消息,直到隊(duì)列被解鎖。顯然,當(dāng)你準(zhǔn)備好要繼續(xù)的時(shí)候,打開隊(duì)列是非常重要的。

總結(jié)

以上是生活随笔為你收集整理的Photon多人游戏开发教程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。