PUN☀️八、拓展网络同步:RPCs 和 Properties
文章目錄
- 🟥 RPCs
- 🟧 Properties
- 1?? 玩家(Player)的自定義屬性
- 🚩 數(shù)據(jù)同步到網(wǎng)絡(luò)
- 🚩 實(shí)時(shí)獲取方式
- 🚩 回調(diào)獲取
- 2?? 房間的自定義屬性
- 🚩 同步到網(wǎng)絡(luò)
- 🚩 實(shí)時(shí)獲取
- 🚩 回調(diào)獲取房間自定義屬性
🟥 RPCs
RPCs,即Remote Procedure Call (RPC)
它的作用是:
玩家調(diào)用自己的方法。且這個(gè)調(diào)用,可在所有客戶端等同步。RPCs 和 OnPhotonSerializeView 相比,寫法更簡(jiǎn)便。
RPC適合哪些場(chǎng)景呢?
非頻繁更新(玩家的行動(dòng)),比如改變角色的裝備、使用工具或結(jié)束一個(gè)回合的游戲,都是不常見(jiàn)的動(dòng)作(相對(duì)于位置,角色狀態(tài)這些頻繁更新的屬性來(lái)說(shuō))。這些動(dòng)作基于用戶的輸入,用 RPC 發(fā)送方便。
效果展示:
使用RPCs同步顯示一個(gè)盒子
如何使用呢?
比如,我們想實(shí)現(xiàn),顯示我們自己的寶劍,且在各個(gè)客戶端同步。
若按以前我們的思路,可能用 OnPhotonSerializeView ,先寫代碼傳讀寫數(shù)據(jù),再掛載到 PhotonView上進(jìn)行同步。
現(xiàn)在,我們一步便可實(shí)現(xiàn):
1.顯示寶劍的方法 ,用 [PunRPC] 標(biāo)記。
2.調(diào)用該方法: photonView.RPC(“顯示寶劍方法”, RpcTarget.All); 完成。
代碼如下:
🟧 Properties
Properties的作用:
CustomProperties適合非常罕見(jiàn)的更改同步。
比如我們想知道服務(wù)器房間中,那個(gè)玩家是工程師這個(gè)職業(yè)。那么我們就可以先給自己設(shè)置職業(yè)屬性,并同步到服務(wù)器,接著,其他人就能從服務(wù)器,知道你是什么職業(yè)了。
同時(shí),若玩家B只能等玩家A做完他的操作,才能進(jìn)行下一步。那么,也可以通過(guò)這個(gè) Properties,當(dāng)玩家A完成自己任務(wù),將狀態(tài)同步到服務(wù)器,玩家B的檢測(cè)屬性更改的回調(diào),會(huì)判斷A是不是完成了。完成了B就能開(kāi)始他的操作了。
CustomProperties分為兩種:
- 一種是房間的自定義屬性CustomProperties,
- 一種是玩家(Player)的自定義屬性CustomProperties。
知識(shí)點(diǎn):
值在客戶端上被同步和緩存,因此你不必在使用前獲取它們,現(xiàn)用現(xiàn)取即可。
使用流程:
1.將數(shù)據(jù)同步到網(wǎng)絡(luò)
2.從網(wǎng)絡(luò)獲取該值,使用。
1?? 玩家(Player)的自定義屬性
🚩 數(shù)據(jù)同步到網(wǎng)絡(luò)
該值可隨時(shí)更新,不存在更新時(shí)刻必須在Start等限制。
//要同步的屬性的值public string myJob;void Start(){//將值同步到網(wǎng)絡(luò)Hashtable props = new Hashtable() { { "Job", myJob } };PhotonNetwork.LocalPlayer.SetCustomProperties(props);}獲取方式有兩種:
- 一種是實(shí)時(shí)獲取,需要時(shí)獲取。
- 一種是回調(diào)。
🚩 實(shí)時(shí)獲取方式
該值可以隨時(shí)獲取,獲取到的都是最新的。
foreach (Player p in PhotonNetwork.PlayerList) {object tarJob;if (p.CustomProperties.TryGetValue("Job", out tarJob)){print((string)tarJob);} }🚩 回調(diào)獲取
需繼承 MonoBehaviourPunCallbacks
可使用:
- 玩家自定義屬性回調(diào)、
- 房間自定義屬性回調(diào)。
//玩家的自定義信息回調(diào)
2?? 房間的自定義屬性
跟玩家的自定義屬性使用方法類似,需繼承 MonoBehaviourPunCallbacks。
🚩 同步到網(wǎng)絡(luò)
Hashtable setScene = new Hashtable(); setScene["curScn"] = 1;PhotonNetwork.CurrentRoom.SetCustomProperties(setScene);🚩 實(shí)時(shí)獲取
if(PhotonNetwork.CurrentRoom.CustomProperties.ContainsKey("curScn"))print(PhotonNetwork.CurrentRoom.CustomProperties["curScn"]);🚩 回調(diào)獲取房間自定義屬性
public override void OnRoomPropertiesUpdate(Hashtable propertiesThatChanged) {//ContainsKey(你想使用的key)if (propertiesThatChanged.ContainsKey("curScn")){print(propertiesThatChanged["curScn"]);} }
大家還有什么問(wèn)題,歡迎在下方留言!
如果你有 技術(shù)的問(wèn)題 或 項(xiàng)目開(kāi)發(fā)
都可以加下方聯(lián)系方式
和我聊一聊你的故事🧡
總結(jié)
以上是生活随笔為你收集整理的PUN☀️八、拓展网络同步:RPCs 和 Properties的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【持续更新】Pun多人在线游戏开发教程
- 下一篇: TCP协议格式和特点