Photon Unity Networking (PUN) пытается отслеживать игроков в каждой команде

Что я хочу, так это когда игрок подключается к комнате, которую он выбирает, красный или синий (1 или 2) Максимальное количество игроков для каждой команды - 5, я отслеживаю игроков, используя такие переменные, как

int currentRedPlayers = 0;
int maxRedPlayers = 5;
int currentBluePlayers = 0;
int MaxBluePlayers = 5;

У меня было много проблем с синхронизацией этого по сети ... в настоящее время я делаю, когда вы присоединяетесь к комнате, вы создаете GameManagerObject для себя, используя PhotonNetwork.Instantiate. Предполагая, что вы первый, кто присоединился к серверу, переменные currentRedPlayers и currentBluePlayers будут установлены в 0. Затем, когда вы выберете команду (скажем, вы выберете красную команду), currentRedPlayers перейдет на 1, поэтому 4 переменные будут выглядеть следующим образом.

currentRedPlayers = 1;
maxRedPlayers = 5;
currentBluePlayers = 0;
MaxBluePlayers = 5;

это работает.

Теперь предположим, что присоединяется второй игрок и он выбирает синюю команду, их переменные будут

currentRedPlayers = 0;
maxRedPlayers = 5;
currentBluePlayers = 1;
maxBluePlayers = 5;

Мой способ заставить два клиента обновлять друг друга GameManagerObject состоял в том, чтобы добавить представление фотона и заставить его наблюдать за сценарием объекта «GameManager». Это сценарий:

using UnityEngine;
using System.Collections;

public class GameManager : MonoBehaviour
{
    public int currentRedPlayers = 0;
    public int maxRedPlayers = 5;
    public int currentBluePlayers = 0;
    public int maxBluePlayers = 5;

    void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info)
    {
        if (stream.isWriting)
        {
            //player sends info to network data
            stream.SendNext(currentRedPlayers);
            stream.SendNext(currentBluePlayers);
        }
        else
        {
            //player recieves info from network data (isReading)
            currentRedPlayers = (int)stream.ReceiveNext();
            currentBluePlayers = (int)stream.ReceiveNext();
        }
    }
}

Предполагается, что это обновит GameManagerObject каждого клиента, чтобы каждый из них считал переменные как

currentredPlayers = 1;
maxRedplayers = 5;
currentBluePlayers = 1;
maxBluePlayers = 5;

но вместо этого он будет показывать только свои собственные, если я запускаю клиент 1 в редакторе единства и клиент 2 как сборку и запуск, я вижу в клиенте один в иерархии, который показывает оба экземпляра GameManagerObjects для каждого игрока, и показывает их правильные значения как

int currentRedPlayers = 1;
int maxRedPlayers = 5;
int currentBluePlayers = 0;
int MaxBluePlayers = 5;

а также

currentRedPlayers = 0;
maxRedPlayers = 5;
currentBluePlayers = 1;
maxBluePlayers = 5;

Но они НЕ обновляют друг друга. (вот как я хочу, чтобы это выглядело)

int currentRedPlayers = 1;
int maxRedPlayers = 5;
int currentBluePlayers = 1;
int MaxBluePlayers = 5;

Прошу прощения, если это вопрос новичка, но я очень новичок, когда дело доходит до PUN, я потратил бесчисленное количество часов, пытаясь найти разные способы исправить это, но это примерно так же близко, как и я и я ударился о стену. Может ли кто-нибудь подсказать мне, как я могу заставить объекты каждого клиента обновлять друг друга, чтобы они могли правильно читать текущих игроков в комнате?


person aLovedHater    schedule 18.11.2015    source источник
comment
Вы должны использовать для этого rpc   -  person ali.turan    schedule 19.11.2015
comment
спасибо :) Я пробовал использовать rpc раньше, но он обновлял только одного клиента, затем я отказался и попробовал то, что я опубликовал в OP. Теперь, когда вы указали мне правильное направление, я провел небольшое исследование и устранил проблему! Спасибо   -  person aLovedHater    schedule 19.11.2015
comment
Я бы сказал больше, если бы вы спросили lol, но если вы исправили это, это здорово! :)   -  person ali.turan    schedule 19.11.2015


Ответы (1)


Вы, наверное, уже нашли ответ, но для всех остальных просто используйте customproperties.

using System.Linq;

public void team()
{
     int redteam = 0, blueteam = 0; 
     PhotonNetwork.playerList.ForEach(x => { if (x.customproperties[teamproperty] == "red") redteam++; else if (x.customproperties[teamproperty] == "blue") bluetime++; });
}
person xplatinumx15    schedule 22.05.2016