【问题标题】:PUN Changes affect local players only, not other clientsPUN 更改仅影响本地玩家,不影响其他客户端
【发布时间】:2020-01-07 03:14:58
【问题描述】:

我一直对其他客户端在玩家游戏中的行为有一些疑问。基本上,如果有影响每个客户的变化,它就会起作用。但是,它只会在本地播放器的屏幕上正确显示。其他玩家(他们出现在客户端屏幕上)保持不变。

例如,假设我将一个名为“test”的布尔值设置为 false。房间里的每个玩家同时将这个布尔值变为真。每个玩家自己的角色都将“测试”设置为 true,但本地玩家屏幕上的其他客户端将其布尔值显示为 false

我如何通过以下每个玩家的示例:

foreach (var item in PhotonNetwork.PlayerList)
            {
                var itemPhotonView = (PhotonView)item.TagObject;

                itemPhotonView.RPC("SetPlayerTeam", item, citiString);
            }

我希望上面的代码遍历每个角色,即使不是本地玩家。我相信它会实现它,但我不是 100% 确定。

public override void OnPlayerPropertiesUpdate(Player target, ExitGames.Client.Photon.Hashtable changedProps)
        {
            if (changedProps.ContainsKey("team"))
            {
                var targetPhotonView = (PhotonView)target.TagObject;
                targetPhotonView.RPC("ChangeTeamObjs", target, changedProps);
            }

        }

我确信上面的代码不会改变非本地客户端。我不确定是否应该像第一个示例一样使用“foreach”方法,因为我什至不确定这是否会完成。有什么想法吗?

【问题讨论】:

    标签: c# unity3d multiplayer photon


    【解决方案1】:

    向所有人发送 rpc 可以更有效地完成,通过将 rpc 的目标定义为每个人,这将防止网络流量过载,并且只发送一个 rpc。

    https://doc.photonengine.com/en-us/pun/v2/gameplay/rpcsandraiseevent#targets__buffering_and_order

    PhotonView photonView = PhotonView.Get(this);
    photonView.RPC("ChangeTeamObjs", RpcTarget.All, , item, citiString);
    

    【讨论】:

    • 大多数这些 RPC 都是从 GameManager 类型脚本调用的。我可以更改为“PhotonView.Get(this);”我做到了。与“RpcTarget.All”相同。现在,代码似乎运行不合理。每个人都应该被设置为“公民”,一个人被设置为“天使”。相反,每个人的团队都设置为天使。不过,只有一个人的模型变成了天使模型。另外,另外两个拥有公民模型的天使除了速度改变之外,什么都没有。只有本地玩家受到影响,现在似乎是所有玩家。 如果您希望我使用我的代码添加更多帖子 cmets,我可以。
    • 没关系,在修复了我的意大利面条代码的其他部分之后,RpcTarget.All 确实解决了这个问题。谢谢!
    猜你喜欢
    • 2012-04-11
    • 2010-10-12
    • 1970-01-01
    • 2019-01-19
    • 1970-01-01
    • 1970-01-01
    • 2022-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多