Jump to content
Sign in to follow this  
Shady

Consulta sala multijugador

Recommended Posts

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

 

Share this post


Link to post
Share on other sites

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!

Share this post


Link to post
Share on other sites

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!

Gracias por la respuesta! :)

El servidor(que también es cliente) recibe los nombres de todos los jugadores. 
Los jugadores conectados solo ven su nombre en la lista y el del host. De los demas pareciera que no llega el nombre, pero si se ve el lobbyPlayerPrefab.
Es decir entre clientes no se ven los nombres, excepto el del creador. Pero si se ven los lobbyPlayerPrefab

¿Me podrias pasar el canal de YT le echo una ojeada luego?

Gracias.

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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.

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,

Edited by Shady
Solucion encontrada :)

Share this post


Link to post
Share on other sites
Sign in to follow this  

UnitySpain © Todos los derechos reservados 2020
×
×
  • Create New...