Вопрос о PhotonNetwork.CurrentRoom.CustomProperties - PullRequest
0 голосов
/ 10 июля 2019

Когда игра запускается в многопользовательском режиме, главный клиент отправляет PunRPC, чтобы все клиенты запускали функцию.Эта функция пытается получить свойства комнаты, чтобы увидеть, активна ли игра, если она что-то делает.По какой-то причине клиент получает ошибку нулевой ссылки, а главный клиент - нет.Странно то, что отладка хеш-таблицы для свойств комнаты видна, но я не могу получить в ней определенный элемент.

Попытка отладки хеш-таблицы, чтобы убедиться, что ключ был установлен при запуске кода,Это было."(System.String) ag = (System.Boolean) True ag = activeGame" Это показано в Debug.Log(hash);, но (bool)hash[rpk.activeGame] получает нулевую ссылку на ошибку.Но только на стороне клиента, а не главного клиента.Таким образом, ключ также работает.

// Call all the clients to set up the room settings in the sub menu.
    [PunRPC]
    private void GameRoomSetup (string pOne, string pTwo, int pOneColor, int pTwoColor)
    {
        GameObject gameMenu = GameObject.Find ("GameMenu");

        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 ();
        }

        hash = PhotonNetwork.CurrentRoom.CustomProperties;
        Debug.Log(hash);
        if ((bool)hash[rpk.activeGame]) // Error on this line on client but not on master client. Says null reference.
        {
            GameObject.Find ("SoundManager").GetComponent<SoundManagerScript> ().PlayBackgroundTwo ();
            GameObject.Find ("GameMenu").GetComponent<SubMenu> ().ChangeSubMenuActive (false);
        }
    }

Я пытаюсь выполнить оператор if как клиент, но получаю ошибку.

1 Ответ

0 голосов
/ 12 июля 2019

Спасибо, что выбрали Фотон!

Чтобы получить пользовательское свойство, я рекомендую использовать метод 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) ( ссылочный API ).

Другие примечания и рекомендации:

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

Не уверен, поддерживается ли он или есть хорошая идея передать несколько параметров методу PUN RPC.

Для отладки журнала Dictionary или Hashtable вы можете использовать метод 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. Прочитайте " Как сравнить строки в 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 игрока.

...