🟥 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"]); } }