Я разрабатываю сервер-клиентское приложение, используя 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;
}