You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Photon获取玩家自定义Ready属性遇代码报错,寻求解决方案

解决Photon自定义属性编译错误及获取所有玩家就绪状态的方法

先解决编译错误

你的两个错误都是因为命名空间引用和方法签名不匹配导致的:

1. 补充必要的命名空间

Player类型属于Photon.Realtime命名空间,同时ExitGames.Client.Photon.Hashtable需要明确引用(避免和System.Collections下的Hashtable混淆)。在脚本顶部添加以下代码:

using Photon.Realtime;
using ExitGames.Client.Photon;

2. 修正方法签名

确保你的脚本继承自MonoBehaviourPunCallbacks,并且OnPlayerPropertiesUpdate的参数类型完全和基类一致。修正后的方法如下:

public override void OnPlayerPropertiesUpdate(Player targetPlayer, Hashtable changedProps)
{
    base.OnPlayerPropertiesUpdate(targetPlayer, changedProps);
    
    if (!PhotonNetwork.IsMasterClient) 
        return;
    if (!changedProps.ContainsKey("ready"))
        return;
    
    // 处理单个玩家的ready状态变化
    bool isReady = (bool)targetPlayer.CustomProperties["ready"];
    Debug.Log($"玩家 {targetPlayer.NickName} 的就绪状态变为: {isReady}");
}

获取所有玩家的就绪状态

如果需要主动获取当前房间内所有玩家的ready属性,直接遍历PhotonNetwork.PlayerList即可:

public void CheckAllPlayersReadyStatus()
{
    if (!PhotonNetwork.InRoom)
        return;
    
    foreach (Player player in PhotonNetwork.PlayerList)
    {
        // 先判断属性是否存在,避免抛出KeyNotFoundException
        if (player.CustomProperties.TryGetValue("ready", out object readyObj) && readyObj is bool isReady)
        {
            Debug.Log($"玩家 {player.NickName} 的就绪状态: {isReady}");
        }
        else
        {
            // 若玩家未设置ready属性,默认视为未就绪
            Debug.Log($"玩家 {player.NickName} 未设置就绪状态,默认未就绪");
        }
    }
}

额外提示

  • 设置自定义属性时,建议使用只传递变化属性的重载,减少网络开销:
var props = new Hashtable { { "ready", true } };
PhotonNetwork.LocalPlayer.SetCustomProperties(props, null, true);
  • MasterClient需要检查全员就绪时,调用上面的CheckAllPlayersReadyStatus方法,遍历后判断所有玩家的ready值是否都为true即可。

内容的提问来源于stack exchange,提问作者Jerry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 03:25:30