PUN 2 Получение пользовательских свойств

Недавно я взялся за настройку пользовательских свойств в Photon. Мне удалось выяснить, как установить настраиваемые свойства, но не получить настраиваемые свойства. Моя хэш-таблица находится в моем скрипте контроллера плеера, а место, где я устанавливаю (и где я хочу получить) свойства, находится в циклическом скрипте.

Из RoundSystem:

private IEnumerator TeamBalance()
    {
        angelCount = Mathf.Floor(PhotonNetwork.PlayerList.Length * angelPercent);
        currentAngels = angelCount;
        currentPlayers = PhotonNetwork.PlayerList.Length;

        foreach (var item in PhotonNetwork.PlayerList)
        {
            var itemPhotonView = (PhotonView)item.TagObject;

            itemPhotonView.RPC("SetPlayerTeam", item, citiString);
        }

        for (int i = 0; i < angelCount;)
        {
            var item = PhotonNetwork.PlayerList[Random.Range(0, PhotonNetwork.PlayerList.Length)];
            var itemPhotonView = (PhotonView)item.TagObject;

            if (/* random player selected's, AKA, item's team == citiString */)
            {
                itemPhotonView.RPC("SetPlayerTeam", item, angelString);

                i++;
            }
        }

        yield return null;
        //the reason this is in an IEnumerator with 'yield return null'
        //is because I plan to add a waiting period once I figure this out
        //it's for the game loop
    }

Из PlayerController:

[PunRPC]
        public void SetPlayerTeam(string teamString)
        {
            //in the class:     private ExitGames.Client.Photon.Hashtable playerProperties; 
            if (!playerProperties.ContainsKey("team"))
            {
                playerProperties.Add("team", teamString);
            }
            playerProperties["team"] = teamString;
            PhotonNetwork.LocalPlayer.SetCustomProperties(playerProperties);
        }

В начале раунда определенный процент (в данном случае 1/3) игроков выбирается в качестве «ангела». Проверка здесь необходима, потому что в случае нескольких ангелов вы не хотите, чтобы уже существующий ангел считался новым изменением. (Кроме того, вероятно, важно знать, как получить пользовательские свойства, если я собираюсь их использовать.) Если я не включу проверку в RoundSystem, результатом будет 2 гражданина и 1 ангел (в тесте с 3 игроки). Кроме того, если вы видите какой-либо спагетти-код, который можно было бы улучшить, не стесняйтесь сообщить мне об этом. :)


person Jack Sebben    schedule 04.01.2020    source источник


Ответы (1)


Используйте словарь Player.CustomProperties для доступа к пользовательским свойствам проигрывателя.

    foreach (var item in PhotonNetwork.PlayerList)
    {
        if (item.CustomProperties.ContainsKey("team"))
        {
            Debug.Log(item.CustomProperties["team"]);
        }
    }

Кроме того, RoundSystem может реализовать интерфейс IInRoomCallbacks и прослушивать OnPlayerPropertiesUpdate, чтобы поймать точный момент обновления команды. https://doc-api.photonengine.com/en/pun/ v2/interface_photonPlayer.CustomProperties1_realtimePlayer.CustomProperties1_i_in_room_callbacks.html

person Aleksandr Stepanov    schedule 04.01.2020
comment
Благодарю вас! Я был уверен, что уже пробовал это, но, похоже, я ошибался... Кроме того, спасибо за подсказку об OnPlayerPropertiesUpdate. - person Jack Sebben; 04.01.2020
comment
Возможно, вам придется немного подождать после обновления свойств на одном клиенте, чтобы изменения распространились на другие клиенты. - person Aleksandr Stepanov; 04.01.2020
comment
Да, это была еще одна проблема, которую я понял вскоре после этого, спасибо! - person Jack Sebben; 04.01.2020