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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/18 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PUN☀️八、拓展网络同步:RPCs 和 Properties 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 🟥 RPCs
  • 🟧 Properties
    • 1?? 玩家(Player)的自定義屬性
      • 🚩 數據同步到網絡
      • 🚩 實時獲取方式
      • 🚩 回調獲取
    • 2?? 房間的自定義屬性
      • 🚩 同步到網絡
      • 🚩 實時獲取
      • 🚩 回調獲取房間自定義屬性


🟥 RPCs

RPCs,即Remote Procedure Call (RPC)

它的作用是:

玩家調用自己的方法。且這個調用,可在所有客戶端等同步。RPCs 和 OnPhotonSerializeView 相比,寫法更簡便。

RPC適合哪些場景呢?

非頻繁更新(玩家的行動),比如改變角色的裝備、使用工具或結束一個回合的游戲,都是不常見的動作(相對于位置,角色狀態這些頻繁更新的屬性來說)。這些動作基于用戶的輸入,用 RPC 發送方便。

效果展示:

使用RPCs同步顯示一個盒子

如何使用呢?

比如,我們想實現,顯示我們自己的寶劍,且在各個客戶端同步。

若按以前我們的思路,可能用 OnPhotonSerializeView ,先寫代碼傳讀寫數據,再掛載到 PhotonView上進行同步。

現在,我們一步便可實現:

1.顯示寶劍的方法 ,用 [PunRPC] 標記。
2.調用該方法: 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);//發送給除自己以外的所有人//photonView.RPC("ShowSword", RpcTarget.Others);}}#region PunRPC[PunRPC]public void ShowSword(){obj.SetActive(true);}#endregion }



🟧 Properties

Properties的作用:

CustomProperties適合非常罕見的更改同步。

比如我們想知道服務器房間中,那個玩家是工程師這個職業。那么我們就可以先給自己設置職業屬性,并同步到服務器,接著,其他人就能從服務器,知道你是什么職業了。

同時,若玩家B只能等玩家A做完他的操作,才能進行下一步。那么,也可以通過這個 Properties,當玩家A完成自己任務,將狀態同步到服務器,玩家B的檢測屬性更改的回調,會判斷A是不是完成了。完成了B就能開始他的操作了。

CustomProperties分為兩種:

  • 一種是房間的自定義屬性CustomProperties,
  • 一種是玩家(Player)的自定義屬性CustomProperties。
    知識點:

值在客戶端上被同步和緩存,因此你不必在使用前獲取它們,現用現取即可。

使用流程:

1.將數據同步到網絡
2.從網絡獲取該值,使用。



1?? 玩家(Player)的自定義屬性

🚩 數據同步到網絡

該值可隨時更新,不存在更新時刻必須在Start等限制。

//要同步的屬性的值public string myJob;void Start(){//將值同步到網絡Hashtable props = new Hashtable() { { "Job", myJob } };PhotonNetwork.LocalPlayer.SetCustomProperties(props);}

獲取方式有兩種:

  • 一種是實時獲取,需要時獲取。
  • 一種是回調。



🚩 實時獲取方式

該值可以隨時獲取,獲取到的都是最新的。

foreach (Player p in PhotonNetwork.PlayerList) {object tarJob;if (p.CustomProperties.TryGetValue("Job", out tarJob)){print((string)tarJob);} }



🚩 回調獲取

需繼承 MonoBehaviourPunCallbacks

可使用:

  • 玩家自定義屬性回調、
  • 房間自定義屬性回調。
    //玩家的自定義信息回調
//玩家的自定義信息回調 public override void OnPlayerPropertiesUpdate(Player targetPlayer, Hashtable changedProps) {//ContainsKey(你想使用的key)if (changedProps != null && changedProps.ContainsKey(你想使用的key)){print(changedProps[你想使用的key]);} }



2?? 房間的自定義屬性

跟玩家的自定義屬性使用方法類似,需繼承 MonoBehaviourPunCallbacks。

🚩 同步到網絡

Hashtable setScene = new Hashtable(); setScene["curScn"] = 1;PhotonNetwork.CurrentRoom.SetCustomProperties(setScene);



🚩 實時獲取

if(PhotonNetwork.CurrentRoom.CustomProperties.ContainsKey("curScn"))print(PhotonNetwork.CurrentRoom.CustomProperties["curScn"]);



🚩 回調獲取房間自定義屬性

public override void OnRoomPropertiesUpdate(Hashtable propertiesThatChanged) {//ContainsKey(你想使用的key)if (propertiesThatChanged.ContainsKey("curScn")){print(propertiesThatChanged["curScn"]);} }





大家還有什么問題,歡迎在下方留言!



如果你有 技術的問題 項目開發

都可以加下方聯系方式

和我聊一聊你的故事🧡

總結

以上是生活随笔為你收集整理的PUN☀️八、拓展网络同步:RPCs 和 Properties的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。