Noticias

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

P2 - UNET [Networking] - Sistema de Puntuacion

Iniciado por francoe1, Enero 31, 2016, 03:26:25 AM

Tema anterior - Siguiente tema
Enero 31, 2016, 03:26:25 AM Ultima modificación: Febrero 04, 2016, 06:58:49 PM por francoe1
Bienvenidos a la segunda parte del "Tutorial de UNET en español"Hoy vamos a tratar de entender cómo funcionan los comandos y sync var de una manera más detallada y luego vamos a programar un sistema de puntuación que nos permita gestionar  KILLS - DEATHS - SCORE - NAME¿Cómo funcionan los Command?
Los comandos son funciones que se encuentran del lado cliente pero se ejecutan del lado servidor, es decir, cuando nosotros llamamos un comando desde cualquier cliente no se ejecuta en dicho cliente, si no en el Servidor. ¿Y esto para que sirve?, Bien, esto nos sirve para dejar que el servidor se encargue de todos los datos del juego aplique las reglas y sincronice estos datos con los demás Jugadores, Ver el Ejemplo de Sincronización de Movimiento.¿Qué son las SyncVar?
Con las SyncVar podemos sincronizar variables de datos Simples, Como INT - STRING - FLOAT y otros característicos de unity como VECTOR3, aunque estas siempre deben ser actualizadas por el servidor, ya que el cliente no tiene el privilegio de hacerlo.Entonces ¿Cómo se fusionan las dos?
Primero, deberíamos pensar la lógica de forma local, es decir, sin ponernos a pensar en Sincronización u otros aspectos Multijugador, supongamos que estamos pensando hacer un FPS SIMPLE, entonces empezamos creando el Movimiento del Jugador, Move, Jump, Rotate, RotateCamera estas serían nuestras funciones para controlar todo el movimiento del personaje. 
Una vez ya programado esta parte, debemos Sincronizar la Posicion y Rotacion del Jugador, más la Cámara (VER PARTE 1).Esto fue una breve y simple explicacion de como funciona, pero voy a resumirlo en simples pasos explicativos para que sea más fácil entender.
1- Realizamos la Acción Localmente
2- Enviamos los Resultados por Cmd al Servidor
3- El Servidor asigna los datos recibidos en su correspondiente variable.
4- Los Cliente no locales sincroniza cada instancia con los valores sincronizados.Bueno, ya teniendo en cuenta todo lo anterior pasemos a construir nuestro sistema de Puntuación.
1- Vamos a necesitar 4 Variables 4 Funciones y 4 Comandos.
 
[SyncVar]
public string Name;
[SyncVar]
public int Kills;
[SyncVar]
public int Deaths;
[SyncVar]
public int Score;

public void SetName(string value)
{
    Name = value;
    Cmd_SetName(value);
}

public void AddKill()
{
    Kills++;
    Cmd_AddKill(Kills);
}

public void AddDeath()
{
    Deaths++;
    Cmd_AddDeath(Deaths);
}

public void AddScore(int value)
{
    Score += value;
    Cmd_AddKill(Score);
}

[Command]
private void Cmd_SetName(string value)
{
    if(!isServer)return;
    Name = value;
}

[Command]
private void Cmd_AddKill(int value)
{
    if(!isServer)return;
    Kills = value;
}

[Command]
private void Cmd_AddDeath(int value)
{
    if(!isServer)return;
    Deaths = value;
}

[Command]
private void Cmd_AddScore(int value)
{
    if(!isServer)return;
    Score = value;
}
Con esto ya tenemos nuestro sistema de puntuación funcionando, ahora debemos gestionarlo, vamos a crear una función OnGUI para visualizar los datos de todos lo Clientes conectados.
void OnGUI()
{
    foreach(PlayerInfo current in GameObject.FindObjectsOfType<PlayerInfo>())
    {
        if(current == this)GUI.color = Color.red;
        GUILayout.Box(current.Name + " D [" + current.Deaths + "] K [" + current.Kills + "] S [ " + current.Score + "]" );
    }
}
Bien, ahora podemos hacer nuestro test utilizando Inputs y la función Update
void Update()
{
    if(!isLocalPlayer)return; // Si no es el jugador Local Sale de la funcion UPDATE

    if(Input.GetMouseButtonDown(0))AddScore(100);
    if(Input.GetMouseButtonDown(1))AddKill();
    if(Input.GetMouseButtonDown(2))AddDeath();
}
FIN DE LA SEGUNDA PARTE Siguientes
Sistema de Puntuaje + UNET + Simple UI
Sistema de Salud + UNET + Simple UI
Explicación más detalladas de Command
Sistema de Disparos + UNET + Simple UI

VIDEO TUTORIAL de todo lo explicado
Como dije al comienzo, espero que esto no sea solo un aporte de mi parte, si no que todos los que sepan y quieran aportar vayan anexando sus conocimiento, prácticas y ejemplos para poder entender mejor cómo armar nuestro propio juego en red..

PD: El post lo escribí todo desde la WEB pueden existir errores en la Sintaxis de la programacion. NO SE OLVIDEN DE PASAR POR MI CANAL DE YOUTUBE, DONDE SUBO TUTORIALES SOBRE UNITY
">IR AL CANAL [/quote]¡SALUDOS A TODOS y SUERTE!  

Muy bueno @francoe1!! Sería buena idea que el Networking tenga foro propio... @pioj 

[quote author=juanma_teso" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="35053" data-ipsquote-contentcommentid="126673">Muy bueno http://unityspain.com/profile/18127-francoe1/?do=hovercard" data-mentionid="18127" href="<___base_url___>/profile/18127-francoe1/">@francoe1!! Sería buena idea que el Networking tenga foro propio... http://unityspain.com/profile/18485-pioj/?do=hovercard" data-mentionid="18485" id="ips_uid_3" href="<___base_url___>/profile/18485-pioj/">@pioj :)

Gracias por el tutorial, me sirve para aclarar algunos conceptos jeje.
 
 
 
Saludos!

Cita de: Er_TaloN date=1479289452Gracias por el tutorial, me sirve para aclarar algunos conceptos jeje.
   
   
       
   
   
      Saludos!
   


De nada.. En el blog vas a encontrar mas material.

He estado echando un vistazo, pero hay cosas que tu envías como por ejemplo el tema de la posición, pero si utilizas NetworkTransform(creo recordar), se envía de forma automática. Para qué hacerlo manual ?
 
Te digo esto, desde la ignorancia, he empezado esta mañana a mirar el Network de Unity.
 
Un saludo compañero.

Cita de: Er_TaloN date=1479298031He estado echando un vistazo, pero hay cosas que tu envías como por ejemplo el tema de la posición, pero si utilizas NetworkTransform(creo recordar), se envía de forma automática. Para qué hacerlo manual ?
   
   
      Te digo esto, desde la ignorancia, he empezado esta mañana a mirar el Network de Unity.
   
   
      Un saludo compañero.
   


En principio la manera en que Sync Transform de UNET trabaja no me es útil, en un FPS necesitas enviar valores todo el tiempo, rotación del jugador y la cámara son 2 valores y la posicion son 3, en total tenes 5 valores, con un simple comando y una buena serialización logre pasar posicion y rotacion completa en tan solo 9 bytes.. sumandoles todo lo necesario para animaciones 8 bytes más, por lo que en total el juego para moverse y ejecutar animaciones solo enviaba 20 bytes por segundo. Leer este articulo https://developer.valvesoftware.com/wiki/Source_Multiplayer_Networking para entender de que hablo.
 
En total si sacamos la cuenta por minuto el jugador envía 1200 bytes lo que equivale a 1.18Kb si a esto le sumamos posibles 20 jugadores tendríamos case 2 Mb por minuto. Luego lógico hay que sumar la sincronización de las estadísticas otra cosas que logre pasar en menos de 20 bytes.. 
 
Teniendo estos valores ahora te das cuenta de que es muy importante poder mani***r vos mismo los datos que salen y llegan...
 
En cuanto tenga tiempo voy a cargar nueva información sobre esto.

Etiquetas: