更新播放器按钮光子

Update player button photon

我有这样的场景: 第一个加入大厅的用户将在他的屏幕上有一个活动按钮。在一些动作之后,如果玩家按下按钮,它将禁用,然后房间中的下一个玩家将激活此按钮,依此类推。 基于 属性 'Turn' 我想像这样更改此按钮状态。

在这个函数中 PassTurn 我首先为 LocalPlayer 设置 Turn 属性 到 false 然后我使用一些逻辑确定下一个玩家, 并为该玩家设置 Turn 属性 到 true.

private PassTurn()
{
    PunHashtable _myCustomProperties_forCurrentPlayer = new PunHashtable();
    _myCustomProperties_forCurrentPlayer["Turn"] = false;
    PhotonNetwork.LocalPlayer.SetCustomProperties(_myCustomProperties_forCurrentPlayer);

    foreach (Player player in PhotonNetwork.PlayerList)
    {
        // ... some logic to determine the next player to set the 'Turn' property to true

        if (someCondition for player) {
            PunHashtable _myCustomProperties_forNextPlayer = new PunHashtable();
            _myCustomProperties_forNextPlayer["Turn"] = true;
            player.SetCustomProperties(_myCustomProperties_forNextPlayer);
        }
    }
}

OnPlayerPropertiesUpdate 函数中,如果 Turn 属性 曾经改变,根据 Turn 属性 值激活或停用按钮(如果 true - 显示按钮,如果 false 不显示按钮)。

public override void OnPlayerPropertiesUpdate(Player targetPlayer, ExitGames.Client.Photon.Hashtable changedProps)
    {
        base.OnPlayerPropertiesUpdate(targetPlayer, changedProps);

        if (targetPlayer != null) {
            if (changedProps.ContainsKey("Turn"))
            {
                {
                    foreach (Player player in PhotonNetwork.PlayerList)
                    {

                        // this print will display (1, false) and (2, false) which is not correct, because the second player doesn't have de property changed
                        print(player.ActorNumber + player.CustomProperties["Turn"];

                        if ((bool)player.CustomProperties["Turn"] == true)
                        {
                            print("HEY HEY HEY 1");
                            endTurnBtn.SetActive(true);
                        }

                        if ((bool)player.CustomProperties["Turn"] == false)
                        {
                            print("HEY HEY HEY 2");
                            endTurnBtn.SetActive(false);
                        }
                    }
                }
            }
        }
    }

这不能正常工作,因为它总是在 HEY HEY HEY 2. 上进入,当前游戏的按钮会消失,但它永远不会出现在下一个玩家身上。

对于这种情况,哪种方法是正确的?我如何更改其他播放器屏幕上的 ui 组件?感谢您的宝贵时间!

稍后根据接受的评论进行编辑:

public override void OnPlayerPropertiesUpdate(Player targetPlayer, ExitGames.Client.Photon.Hashtable changedProps)
{
    base.OnPlayerPropertiesUpdate(targetPlayer, changedProps);

    if (targetPlayer != null) {
        if (changedProps.ContainsKey("Turn"))
        {
            {
                    if ((bool)PhotonNetwork.LocalPlayer.CustomProperties["Turn"] == true)
                    {
                        print("HEY HEY HEY 1");
                        endTurnBtn.SetActive(true);
                    }

                    if ((bool)PhotonNetwork.LocalPlayer.CustomProperties["Turn"] == false)
                    {
                        print("HEY HEY HEY 2");
                        endTurnBtn.SetActive(false);
                    }
            }
        }
    }
}

你遍历每个玩家并检查变量,所以一旦你列表中的最后一个玩家轮到 属性 false,每个玩家都会禁用按钮,而当最后一个玩家轮到 属性 为真每个玩家都会激活按钮。 无论哪种方式,遍历房间中的每个玩家都是没有意义的,因为您只想更改本地显示的按钮。因此,您应该只检查本地 player/players 并相应地更改按钮。