关于PhotonNetwork.CurrentRoom.CustomProperties的问题

时间:2019-07-10 20:37:33

标签: c# unity3d networking photon

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

尝试调试哈希表,以确保在运行代码时设置了密钥。它是。 “(System.String)ag =(System.Boolean)True ag = activeGame”这在<dependency> <groupId>javax.transaction</groupId> <artifactId>jta</artifactId> <version>1.1</version> </dependency> 中显示,但是Debug.Log(hash);收到空引用错误。但仅在客户端而不是主客户端。因此该键也有效。

(bool)hash[rpk.activeGame]

我正在尝试将if语句作为客户端运行,但是出现错误。

1 个答案:

答案 0 :(得分:0)

谢谢您选择光子!

要获取自定义属性,建议您使用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)reference API)。

其他注意事项和建议:

private void GameRoomSetup (string pOne, string pTwo, int pOneColor, int pTwoColor)

不确定是否支持此功能,或者将多个参数传递给PUN RPC方法是否是一个好主意。

要调试DictionaryHashtable的日志,可以使用SupportClass.DictionaryToString()方法。 所以代替

Debug.Log(hash);

使用

Debug.Log(SupportClass.DictionaryToString(hash));

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

    GameObject gameMenu = GameObject.Find ("GameMenu");

此外,您在这里有对gameMenu.GetComponent<SubMenu>()的重复调用,至少调用一次,并缓存找到的组件结果(如果有)。

    gameMenu.GetComponent<SubMenu> ().UpdatePlayers (pOne, pTwo, pOneColor, pTwoColor);
    gameMenu.GetComponent<SubMenu> ().StartGameSetup ();

不应该使用==运算符来比较字符串。至少使用Equal方法和正确的StringComparison类型。阅读“ How to compare strings in C#”。

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

此外,为什么还要使用昵称来检查玩家是一号还是二号?也许使用ActorNumber或自定义玩家索引。或者如果房间仅容纳2位玩家,则使用玩家人数。