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

歡迎訪問(wèn) 生活随笔!

生活随笔

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

编程问答

PUN☀️八、拓展网络同步:RPCs 和 Properties

發(fā)布時(shí)間:2023/12/18 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PUN☀️八、拓展网络同步:RPCs 和 Properties 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 🟥 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); 完成。
代碼如下:

using UnityEngine; using Photon.Pun;public class GameManager_Skode : MonoBehaviourPunCallbacks {//寶劍public GameObject obj;private void Update(){if (!photonView.IsMine)return;if (Input.GetKeyDown(KeyCode.C)){photonView.RPC("ShowSword", RpcTarget.All);//發(fā)送給除自己以外的所有人//photonView.RPC("ShowSword", RpcTarget.Others);}}#region PunRPC[PunRPC]public void ShowSword(){obj.SetActive(true);}#endregion }



🟧 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)
//玩家的自定義信息回調(diào) public override void OnPlayerPropertiesUpdate(Player targetPlayer, Hashtable changedProps) {//ContainsKey(你想使用的key)if (changedProps != null && changedProps.ContainsKey(你想使用的key)){print(changedProps[你想使用的key]);} }



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)題。

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