C# 关于PhotonNetwork.CurrentRoom.CustomProperties的问题

C# 关于PhotonNetwork.CurrentRoom.CustomProperties的问题,c#,unity3d,networking,photon,C#,Unity3d,Networking,Photon,当游戏在多人游戏中开始时,主客户端发送一个PunRPC,让所有客户端运行一个函数。此函数尝试获取房间属性,以查看游戏是否处于活动状态,如果处于活动状态,则会执行某些操作。出于某种原因,客户端会收到空引用错误,但主客户端不会。奇怪的是,房间属性哈希表的调试是可见的,但我无法在其中获取特定项 已尝试调试哈希表,以确保在运行代码时设置了密钥。是的。“(System.String)ag=(System.Boolean)True ag=activeGame”这显示在Debug.Log(hash)中但是(b

当游戏在多人游戏中开始时,主客户端发送一个PunRPC,让所有客户端运行一个函数。此函数尝试获取房间属性,以查看游戏是否处于活动状态,如果处于活动状态,则会执行某些操作。出于某种原因,客户端会收到空引用错误,但主客户端不会。奇怪的是,房间属性哈希表的调试是可见的,但我无法在其中获取特定项

已尝试调试哈希表,以确保在运行代码时设置了密钥。是的。“(System.String)ag=(System.Boolean)True ag=activeGame”这显示在
Debug.Log(hash)中
但是
(bool)散列[rpk.activeGame]
获取空引用错误。但仅在客户端,而不是主客户端。所以这把钥匙也起作用了

//调用所有客户端在子菜单中设置房间设置。
[扑克牌]
私有void游戏室设置(字符串pOne、字符串pTwo、int pOneColor、int pTwoColor)
{
GameObject gameMenu=GameObject.Find(“gameMenu”);
gameMenu.GetComponent().UpdatePlayers(pOne、pTwo、pOneColor、pTwoColor);
gameMenu.GetComponent().startgamestup();
//如果您是玩家,请更改可见的活动按钮。
if(PhotonNetwork.昵称==pOne | | PhotonNetwork.昵称==pTwo)
{
gameMenu.GetComponent().GameStart();
}
hash=PhotonNetwork.CurrentRoom.CustomProperties;
Log(散列);
if((bool)hash[rpk.activeGame])//在客户端的这一行上出错,但在主客户端上没有。表示空引用。
{
GameObject.Find(“SoundManager”).GetComponent().PlayBackgroundTwo();
GameObject.Find(“GameMenu”).GetComponent().changesubmenualive(false);
}
}

我试图以客户机身份运行if语句,但出现错误。

感谢您选择光子

要获取自定义属性,我建议您使用
TryGetValue
方法,如下所示:

    hash = PhotonNetwork.CurrentRoom.CustomProperties;
    object temp;
    string key = rpk.activeGame;
    if (hash.TryGetValue(key, out temp))
    {
        if (temp is bool)
        {
            bool activeGame = (bool)temp;
        }
        else
        {
            // unexpected custom property value type
        }
    } 
    else 
    {
        // custom property not found
    }
如果自定义属性尚不可用,请等待回调
IInRoomCallbacks.OnRoomPropertiesUpdate(Hashtable propertiesThatChanged)
()

其他说明和建议:

private void GameRoomSetup (string pOne, string pTwo, int pOneColor, int pTwoColor)
不确定它是否受支持,或者将多个参数传递给PUN-RPC方法是否是一个好主意

要调试日志
字典
哈希表
,可以使用
SupportClass.DictionaryToString()
方法。 所以不是

Debug.Log(hash);
使用

避免调用昂贵的方法,如
GameObject.Find

    GameObject gameMenu = GameObject.Find ("GameMenu");
此外,这里还有对
gameMenu.GetComponent()
的重复调用,至少调用一次,并缓存找到的组件结果(如果有)

    gameMenu.GetComponent<SubMenu> ().UpdatePlayers (pOne, pTwo, pOneColor, pTwoColor);
    gameMenu.GetComponent<SubMenu> ().StartGameSetup ();
另外,你为什么用这个昵称来检查它是一号玩家还是二号玩家?可以使用ActorNumber或自定义播放器索引。如果房间只能容纳2名玩家,则使用玩家计数

    gameMenu.GetComponent<SubMenu> ().UpdatePlayers (pOne, pTwo, pOneColor, pTwoColor);
    gameMenu.GetComponent<SubMenu> ().StartGameSetup ();
    // If you are a player, change the active buttons that are visible.
    if (PhotonNetwork.NickName == pOne || PhotonNetwork.NickName == pTwo) 
    {
        gameMenu.GetComponent<GameButtonManager> ().GameStart ();
    }