Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

Consulta sala multijugador

Iniciado por Shady, Febrero 26, 2016, 04:00:12 AM

Tema anterior - Siguiente tema
Hola estimados. Estoy desarrollando una sala, a donde se conectan muchos clientes (jugadores), lo que yo estoy queriendo realizar es que en la sala muestre los nombres de cada jugador y el estado (listo/no listo).Luego de una larga batalla contra unity lo que pude hacer es lo siguiente, al conectarse, el host (que también es jugador/cliente) puede ver los nombres de cada cliente.
Cada cliente puede ver su nombre y el nombre del host en la lista, pero no puede ver los nombres de los demás jugadores (Aunque ve el lobbyPlayerPrefab creado, que seria un Panel blanco que contiene el nombre y el estado), se ve el Panel blanco, pero el Text se ve vacío, no tiene contenido. Sin embargo como comentaba más arriba puedo ver el nombre del host, y mi propio nombre.¿Alguien podría ayudarme con este inconveniente o guiarme en el camino para poder solucionarlo?
Cabe aclarar que he leído el Manual de Unity sin embargo, no logro encontrar mi falla. Si necesitan el código, estoy dispuesto a mostrarlo. ¿Podrían mostrarme en código que debo hacer en el script de mi playerLobbyPrefab y/o mi NetworkLobbyManager?Ante nada muchas gracias.Saludos 

Tienes un problema de Sincronizaciones, es decir, el nombre del host se encuentra dentro del servidor, por eso mismo este está actualizado en todas las instancias, el problema reside cuando los jugadores se conectan, seguramente no le están enviando estos datos al servidor, por lo tanto, ni el servidor ni otras instancias conocen tu nombre.El Networking es algo sumamente complejo cuando no tienes mucho conocimiento, si estás recién comenzando te propongo visitar un Canal en YT para seguir tutoriales, yo mismo he hecho varios, hasta de UNET.Ten en cuenta, que esta y otras prácticas son altamente complejas!

[quote author=francoe1" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="35257" data-ipsquote-contentcommentid="127524">Tienes un problema de Sincronizaciones, es decir, el nombre del host se encuentra dentro del servidor, por eso mismo este está actualizado en todas las instancias, el problema reside cuando los jugadores se conectan, seguramente no le están enviando estos datos al servidor, por lo tanto, ni el servidor ni otras instancias conocen tu nombre.El Networking es algo sumamente complejo cuando no tienes mucho conocimiento, si estás recién comenzando te propongo visitar un Canal en YT para seguir tutoriales, yo mismo he hecho varios, hasta de UNET.Ten en cuenta, que esta y otras prácticas son altamente complejas![/quote]Gracias por la respuesta! :)

Te dejo mi Blog http://unitydoc.blogspot.com.ar/Claramente tenes un error de sincronización.haz lo siguiente..Utiliza una función para enviar el nombre de tu jugador al resto de los mismo, de la siguiente manera.
public class PlayerNetwork : NetworkBehaviour
{
    [SyncVar]
    public string PlayerName;
   
    public void ChangeName(string value)
    {
        Cmd_ChangeName(value);
    }
   
    [Command]
    private void Cmd_ChangeName(string value)
    {
        PlayerName = value;
    }
}
De esta manera todos los jugadores tendrán sus nombres sincronizados.

Febrero 26, 2016, 06:58:09 AM #4 Ultima modificación: Febrero 26, 2016, 07:30:39 AM por Shady
[quote author=francoe1" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="35257" data-ipsquote-contentcommentid="127526">Te dejo mi Blog http://unitydoc.blogspot.com.ar/">http://unitydoc.blogspot.com.ar/Claramente tenes un error de sincronización.haz lo siguiente..Utiliza una función para enviar el nombre de tu jugador al resto de los mismo, de la siguiente manera.
public class PlayerNetwork : NetworkBehaviour{
    [SyncVar]
    public string PlayerName;
   
    public void ChangeName(string value)
    {
        Cmd_ChangeName(value);
    }
   
    [Command]
    private void Cmd_ChangeName(string value)
    {
        PlayerName = value;
    }
}
De esta manera todos los jugadores tendrán sus nombres sincronizados.[/quote]Gracias francoe1, eso funciono correctamente ya tengo los playerName sincronizados. Pero, si quisiera que los Text dentro de PlayerNetwork se actualizaran en base a la actualización del PlayerName, ¿como debo hacer?Al final encontré la solución y acople al código que has compartido. He comentado el codigo para que se entienda.
public class lobbyPlayer : NetworkLobbyPlayer {

    // Sincronizo la variable con el servidor
    [SyncVar(hook = "onNameChanged")]
    public string playerName;

    // El Text que deseo actualizar cada vez que se cambia el playerName
public Text playerNameText;


    // Realiza la llamada en el servidor.
    [Command]
    void CmdSetPlayerName(string value)
    {
        playerName = value;
    }

    // Es llamado cada vez que se cambia el nombre de alguien
    void onNameChanged(string value)
    {
        playerName = value;
        playerNameText.text = value;
    }

    // Llamado cuando el jugador local has sido cargado, es llamado luego que OnStartClient
    public override void OnStartLocalPlayer()
    {
        base.OnStartLocalPlayer();
        playerName = PlayerPrefs.GetString("player_name");
        CmdSetPlayerName(playerName);
    }

    // Llamado por cada cliente cuando es activado en un cliente
    public override void OnStartClient()
    {
        base.OnStartClient();
        onNameChanged(playerName);
    }

}
Saludos,

Etiquetas: