Отправка данных, которые генерирует клиент, и эффективная отправка их на сервер - Unity (Unet) - PullRequest
0 голосов
/ 17 марта 2020

Я разрабатываю сервер-клиентское приложение, используя Unet в единстве. Функция заключается в том, что каждый клиент отправит им свой статус «Я подключен» и, если у него есть подключенное устройство (устройство VR) при подключении к серверу, и это будет отвечать за обновление через спрайт (зеленый = вкл, gres = off)

Для разработки этой функциональности я использую:

Моя проблема в том, что существует большая стабильность при обнаружении клиента или устройства при подключении к серверу, и я думаю, что часть как я структурировал свой код, в частности, время обновления и способы отправки данных через net

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

это мой код:

Скрипт, который отвечает за проверку подключений устройств и клиентов и активацию или окрашивание их соответствующих спрайтов (на стороне сервера)

    public Color32 _rgbColorOn;
    public Color32 _rgbColorOff;

    [Space(10)]
    public TextMeshProUGUI[] _deviceName;
    public SVGImage[] _clientImages;

    public bool[] _clientsConnected;

    //Metodo que se encarga de actualizar la inofrmacion de los dipositicos, bateria, temperatura y estado de conexión
    public void CleanTableOfPlayers()
    {
        if (!XRSettings.enabled || XRSettings.enabled)
        {
            for (int i = 0; i < _clientImages.Length; i++)
            {
                _clientsConnected[i] = false;
                if (_clientsConnected[i] == false)
                {
                    _clientImages[i].color = _rgbColorOff; //gris
                }
            }
        }
    }

    //Este metodo actualiza la informacion de los dipositivos(iconos y estado de conexión)
    //basado en su número de ip
    public void SendingClientInformation(string ip)
    {
        for (int i = 0; i < _clientImages.Length; i++)
        {
            if (ip == "192.168.0." + (i + 1))
            {
                _clientsConnected[i] = true;
                _clientImages[i].color = _rgbColorOn; //verde
                break;
            }
        }
    }

Этот скрипт отвечает за получение информации из сети клиента и управляет временем их обновления, чтобы определенные спрайты были окрашены в зеленый или серый цвет (на стороне сервера)

        #region Declaración de variables
    private ClientInfo  _clientInfoScript;
    private VRDevice    _vrDevice;

    //Variables que contrendan la informacion de la bateria, temperatura, ip y nombre del cliente dispositivo
    public string       _ipClient, 
                        _clientName;

    //Comprobador de estados
    public bool         isTransfered;
    #endregion

    #region Metodos para inicialización
    private void Start()
    {
        StartCoroutine( ToggleTransfer() );
        _clientInfoScript = GameObject.FindGameObjectWithTag( "info" ).GetComponent<ClientInfo>();
        _vrDevice = GameObject.FindGameObjectWithTag("info").GetComponent<VRDevice>();
        _ipClient = Network.player.ipAddress;
    }

    private void Update()
    {
        if ( !isServer && isTransfered == true )
        {
            CmdInfo( _ipClient );
            if ( OpenVR.System != null )
            {
                var deviceConnected = OpenVR.System.IsTrackedDeviceConnected( 1 );

                if ( deviceConnected == true )
                    _vrDevice.isTrackedDeviceConnectedVR = true;
                else
                    _vrDevice.isTrackedDeviceConnectedVR = false;

                CmdVRCheck(_vrDevice.isTrackedDeviceConnectedVR, _ipClient);
            }
        }
    }
    #endregion

    #region Corrtuinas

    //entre 0.001 y 1.499 segundos
    private IEnumerator ToggleTransfer()
    {
        if ( isTransfered == false )
        {
            isTransfered = true;
            yield return new WaitForSeconds( 0.001f );
        }
        if (isTransfered == true)
        {
            isTransfered = false;
            yield return new WaitForSeconds( 1.499f );
        }
        StartCoroutine( ToggleTransfer() );
    }
    #endregion

    #region Metodos para envio de red
    //Metdo que envia la informacion por red al servidor
    [Command]
    public void CmdInfo( string deviceIp )
    {
        _clientInfoScript.SendingClientInformation(deviceIp);
    }

    //Metodo que envia la informacion del metodo VRCheck al servidor
    [Command]
    public void CmdVRCheck( bool isTrackedDevice, string deviceIp )
    {
        _vrDevice.VRCheck( isTrackedDevice, deviceIp );
        _vrDevice.SendingVRInformation(deviceIp);
    }
    #endregion

Этот скрипт (на стороне клиента) отвечает за определение наличия у клиента устройства или за его отправку. это через сеть к серверу, чтобы он окрашивал определенный скрипт в зеленый или серый.

    #region Inicializacion de variables

public string       _ipClient;

public bool         isTrackedDeviceConnectedVR;
public bool         isTransfered;

#endregion

#region Metodos de inicializacion
private void Start()
{
    if ( !XRDevice.isPresent || XRDevice.isPresent  )
    {
        //Al iniciar el metodo start, si detectamos VR entonces inicializamos el metodo que se encargara de contar el tiempo para la
        //transferencia de datos
        StartCoroutine( ToggleTransfer() );
    }
    _ipClient = Network.player.ipAddress;
}

private void Update()
{
    if ( hasAuthority && !isServer && isTransfered == true )
    {
        CmdInfo(_ipClient);
        if ( OpenVR.System != null )
        {
            var deviceConnected = OpenVR.System.IsTrackedDeviceConnected( 1 );

            if ( deviceConnected == true )
                isTrackedDeviceConnectedVR = true;
            else
                isTrackedDeviceConnectedVR = false;

            CmdVRCheck( isTrackedDeviceConnectedVR, _ipClient);
        }
    }
}
#endregion

#region Corrutinas
//Metodo que se encarga de enviar la informacion de la baateria, temperatura y actualizacion de iconos
//entre 0.001 y 1.499 segundos
private  IEnumerator ToggleTransfer()
{
    if ( isTransfered == false )
    {
        isTransfered = true;
        yield return new WaitForSeconds( 0.001f );
    }

    if ( isTransfered == true)
    {
        isTransfered = false;
        yield return new WaitForSeconds(1.499f);
    }
    StartCoroutine( ToggleTransfer() );
}
#endregion

#region Metodos para envio de red
//Metdos que envian la informacion por red al servidor
[Command]
private void CmdInfo( string deviceIp )
{
    SendStats( deviceIp );
}

private void SendStats( string deviceIp )
{
    string ip = deviceIp;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...