更新播放器按钮光子
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 并相应地更改按钮。
我有这样的场景: 第一个加入大厅的用户将在他的屏幕上有一个活动按钮。在一些动作之后,如果玩家按下按钮,它将禁用,然后房间中的下一个玩家将激活此按钮,依此类推。 基于 属性 '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 并相应地更改按钮。