Noticias

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

Networking Consulta variables en el servidor

Iniciado por Jose, Octubre 19, 2015, 04:36:52 PM

Tema anterior - Siguiente tema
Hola que tal? tengo un juego de mesa hecho en unity, y queria hacerlo para poder jugar online, y estoy teniendo problemas con algunos temas, el juego en principio logro crear los jugadores y se mueven por el tablero, el tema es con el manejo de las variables que serian globales por asi decirlo, por ejemplo yo tengo la casilla ciudad como bool, si un juegador posee esa casilla deberia ponerse en true y almacenar esa variable en ese jugador, el tema es que no se como hacerlo, mas o menos la estructura que arme en scripts es cada jugador tiene el script jugador y las variables globales las manejo con un script DataGame, sin aplicar el network todo funciona fantastico el tema es cuando aplico el network, es como si todos los jugadores tuvieran la clase DataGame y modificaran su clase y no una global, entonces no me esta funcionando....espero haberme explicado jajaja :(. Saludos y agradeceria algo de orientacion

Tienes un poco de lío entendiendo qué se debe guardar y dónde, te explico:
  • El sevidor es quién gestiona la partida, ¿ok? Por lo tanto, él decide quién gana, quién pierde, y dónde están los jugadores en todo momento y los puntos que lleven. Él es quién debe guardar toda esa información en todo momento.
  • Los clientes/jugadores conectados al servidor sólo tienen una copia de los datos relativos a su lugar en la partida, o cómo mucho datos que ellos necesitan para gestionar SU TURNO en la partida.
  • Las variables globales afectaran a TODOS los miembros del juego. Servidor y Clientes también.
  • Las variables del Servidor afectan al Servidor, y él puede dejar que sean modificadas por los Clientes. El Servidor es quién debería gestionar toda la partida, turnos, score, etc y mandar acciones a los Clientes.
  • Las variables del Cliente afectan a cada jugador por separado, y aunque pueden ser vistas o modificadas por el Servidor, no deberían afectar para nada a la partida en curso.
Toda información del juego y del turno de un jugador, que realice ese jugador debe ser mandada al servidor. Y es el servidor quién gestiona qué le pasa a cada jugador en cada momento.Los scripts de control que tengas (DataGame, etc), has de hacer que el jugador los "pida" ejecutar al servidor, pero que siga siendo el servidor quién los ejecute. Como no das más detalles sobre el código o de cómo lo tienes montado ahora mismo, no sé cómo ayudarte más en este tema, sorry.

Octubre 19, 2015, 06:11:30 PM #2 Ultima modificación: Octubre 19, 2015, 06:15:56 PM por Jose
Si te entiendo es lo que quiero hacer el tema es q no se como :(, ahi paso el codigo mas o menos que tengo:Este es el codigo del jugador:
using System.Collections.Generic;
using UnityEngine.Networking;

public class PlayerNet : NetworkBehaviour {


public List<Transform> casillas;
public int casillaActual1=0;
public int casillaActual=0;
public bool controlador;
private GameObject cas;
int x=0;
private DataGame data;
private GameObject dataGame;
public string propTemporal;
private bool controlTargeta=false;

// Use this for initialization
void Start ()
{
   if (!isLocalPlayer)
      return;
   ///////////////////////////////////////////////////
   dataGame = GameObject.Find("DataGame");
   data = dataGame.GetComponent<DataGame> ();
   cas = GameObject.Find ("Tablero");
   Debug.Log (cas.transform.childCount);
   foreach (Transform hijos in cas.transform)
   {
      if (cas.transform.name == "Centro")
      {
         Debug.Log("No Lo Ingresamos en la Lista");
      }
      else
         {
      Debug.Log("Soy el Hijo: " + hijos.transform);
      casillas.Add(hijos.transform);
      }
   }

   transform.position = new Vector3 (4.19f, 0f, -4.45f);
}

// Update is called once per frame
void Update () {
   ////////////////////////////////////////////////////
   if (!isLocalPlayer)
      return;
   /////////GENERAMOS NUMERO ALEATORIO SIMULANDO DADO//////////
   if (Input.GetKeyUp (KeyCode.Space)) {
      var dado = 1;//Random.Range (1, 6);
      
      casillaActual = casillaActual + dado;
      
      //MOVER JUGADOR POR LAS CASILLAS
      if (casillaActual >= 40)
      {
         casillaActual = casillaActual - casillas.Count;
         transform.position = casillas[casillaActual].position;
      } else
      {
         transform.position = casillas[casillaActual].position;

      }
      ////////////////////////////////////////////////////////
      if(casillaActual==1)
      {
         if(data.ciudad==false)
         {
            controlTargeta=true;
            propTemporal = "CIUDAD";
            data.MostrarTargeta("CIUDAD");
            
         }
      }
Y ahora paso el codigo de DataGame:
using UnityEngine;
using System.Collections.Generic;
using UnityEngine.Networking;

public class DataGame : NetworkBehaviour {


public bool ciudad = false;
public List<string> jugador1Targetas;
public List<string> jugador2Targetas;
public GameObject targetaM;
public List<GameObject> visualTargetas;
public bool ta=false;
private GameObject targeta;
public int dineroA = 2000;
public int dineroB = 2000;
public GameObject go;
public StateManager co;
public GameObject prop;
public MostrarTargeta propM;
public string propTemporal;


 public void MostrarTargeta(string nombreTargeta)
{
   propTemporal = nombreTargeta;
   prop = GameObject.Find("Targetas");
   propM = prop.GetComponent<MostrarTargeta>();
   go = GameObject.Find("Manager");
   co = go.GetComponent<StateManager>();
   co.ActivarPanel();

   if (nombreTargeta == "CIUDAD")
   {
   
      for(int x=0;x<propM.propiedades.Count;x++)
      {
         if(x==0)
         {
            GameObject ko = propM.propiedades
  • ;
            ko.SetActive(true);
         }
         else
         {
            GameObject kol = propM.propiedades
  • ;
            kol.SetActive(false);
         }
      }
   }
   //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//COMPRAR CASILLAS
public void ComprarPropiedad()
{
   if(!jugador1Targetas.Contains(propTemporal))
   {
      jugador1Targetas.Add(propTemporal);
   }


   if(propTemporal == "CIUDAD")
      ciudad=true;
      }
   }
Bueno espero te sirva como para orientarme y ayudarme, gracias y saludos PD: si Hay alguna forma de optimizar mi codigo bienvenida sea  tambien jeje.

Nunca va a funcionar, primero por que no estas sincronizando absolutamente nada, segundo por que tenes muchos errores de conceptos y varios fallos de implementacion.La explicación de Pioj es perfecta "SERVER AUTORITATIVO" es decir, para un juego de mesa no necesitas ni siquiera una predicción por parte del usuario algo que te facilita en un 90% el desarrollo del networking. Ahora debes saber como utilizar SyncVar y Command es decir, como hacer llamadas al servidor, ya que en este momento toda la lógica del juego esta siendo interpretada por el cliente, el servidor aun no esta actuando como tal.Empieza por leer la documentación y seguir los pasas para convertir el juego Offline en Online que se encuentra dentro del ScriptReference de Unity3D, cuando vengas con problemas un poco mas estudiados te daremos una mano. ¡Networking es el Área mas DIFICIL en lo que respecta la programación de Juegos, que Unity3D tenga una herramienta para "Facilitar" la implementacion no quiere decir que este mismo haga magia, tenes que leer y saber muchísimo para lograr algo decente! 

Hola Franco que tal? gracias por responder, mira te cuento: he empezado unity hace 3 meses, y creo yo que lo llevo bastante bien, se hacer cosas simples pero me salen lo mas bien.El tema es el siguiente hace 3 semanas vengo leyendo la documentacion de Networking de unity, y me parece super escasa, osea como vos decis si es algo tan complejo y grande, 5 hojas que hay nomas de documentación me parece poco.... me he cansado de ver videos tutoriales todos hace lo mismo, el juego de la navecita, el de los tanquesitos, y que se muevan sincronizadamente objetos en red....que eso me sale bien por que las fichas de los jugadores en mi juego se mueven bien en red.Si posteo aca es por que no logro entender bien la documentación, si no no estaría postiando cierto?, he buscado hasta cursos pagos con tal de saber un poco mas sobre este mundo pero no he encontrado nada online para hacer, si alguien conoce un curso pero en video conferencia no en video tutoriales estoy agradecido que me lo pasen.Creo q un ejemplo de como preguntar el estado de cierta variable del lado del servidor no deben ser muchas lineas de codigo....(nadie me ha dado uno).Pero bue desde el viernes decidí dejar el Networking porque no he encontrado ayuda en ningún lado, no hay documentación en español y la de ingles lo vuelvo a repetir me parece super acotada.PD: Si alguno sabe de algo en español que explique le agradesco que lo pase... por ahora estoy descepcionado.Ojo no es que soy un vago y me gusta que me den las cosas servidas al contrario me encanta leer y aprender, pero este tema no lo he podido resolver, Saludos

Bien, te paso cosas que debes sabes muy bien antes de cualquier proyecto NetWorking1- Diseñar una aplicación : Fundamental, ya que esto sera el éxito del desarrollo.2- Aprender a desarrollar aplicaciones simples, donde todo funcione bastante bien si ningún problema, aprendiendo el funcionamiento de Rutina, Corrutinas, Delegados, Eventos, Enumeradore, y Otras millones de cosas mas relacionadas a la programacion.3- Para aprender como funciona un NetWorking entonces trata de hacer el mismo juego pero en ves de MultiPlayer LAN o Online trata de hacerlo por Turnos, es decir, crea un Gestor que te permita manejar uno o varios jugadores de forma independientes. esto te ayudará a resolver todos los problemas que se presenta por errores de conceptos e implementacion.4- Estudia cómo funciona el NetWorking y trata de programar chat con .Socket .Net  para entender cómo funciona realmente el networking ¡De esto existe muchisima informacion en internet, con millones de ejemplos prácticos!5- Cuando creas que tengas todo dominado, entonces diseña una Aplicación o Juego Simple, cuando lo tengas piensa como se implementa el modo MultiJugador, en esta etapa trata de optimizar a tal punto de que cuantos menos datos se manda es mejor, es decir, para la Sincronización del jugador trata de enviar los datos necesarios y bien serializados, y por ultimo, desarrolla la aplicación en Un Jugador, y cuando todo funciona de maravillas haz un BackUp y empiezas a implementar el Networking.Esos pasas te sirven para lograr el éxito en cualquier aplicación tanto NetWorking o no No te olvides de pasar por mi canal de YT un abrazo y Suerte!.

Dicho de otro modo ... si quieres programar un juego utilizando el networking de esperate 4 o 5 años dedicandole 8 horas diarias, es lo que te viene a decir xDYo te recomendaria atajar camino y, si dices que ya tienes tu aplicacion que funciona en local perfectamente, mires los miles de video tutoriales sobre el networking que hay por youtube que te enseñan lo basico; en realidad el networking de unity PUN no tiene ningun secreto y son 4 tonterias. Todos los youtubers te enseñan el sistema networking mediante la realizacion del tipico shooter multijugador, pero para captar los dos conceptos que tiene (como puede ser la conexion con el "servidor" y el envio de informacion entre usuarios) vas sobradisimo.Suerte

Noviembre 01, 2015, 03:43:12 AM #7 Ultima modificación: Noviembre 01, 2015, 03:45:23 AM por Jose
Gracias Arthure, claro es lo q digo osea solo queria un ejemplo de como hacer una consulta al estado de una variable del lado del servidor y poder actualizarla, pero nadie me dio un simple ejemplo, todos me dicen ponete a estudiar bla bla bla.... ya tengo la aplicación terminada le faltan algunos detalles, y lo principal que funcione en red, y no logro entender bien el SyncVar ni El command, si alguien me diera un ejemplo, yo ya me doy una idea....y como dices he visto los ejemplos de las navecitas y los tanke pero no logro captar la idea para adaptarlo a mi juego.Básicamente lo que quiero hacer es siempre lo mismo consultar variables al servidor y poder actualizarlas. PD: Solo programo por hobby y para jugar con amigos, simplemente eso.Saludos

Es muy Simple, las variables sincronizadas con SynVar simplemente se actualizan automáticamente en cada cliente, es decir, si en un servidor existen 3 cliente y cada uno tiene un variable nombre de tipo string, con SyncVar puedes hacer que esta misma se actualice en cada cliente EJ:
[SyncVar] private string Name;

void Start()
{
    SetName(new string[]{"Pedro","Juan","Roberto"}[Random.range(0,2)]);

private void SetName(string value)
{
      Name = value;
}
De este modo la variable Name estaría siendo sincronizada, pero para que todo funcione correctamente, cuando queremos cambiar el valor de una variable debemos hacerlo enviando la petición al servidor, entonces este se encarga de actualizarla en todas las instancias. 
[SyncVar] private string Name;

void Start()
{
    SetName(new string[]{"Pedro","Juan","Roberto"}[Random.range(0,2)]);

[Command]
private void Cmd_SetName(string value)
{
      Name = value;
}
Y eso es todo...

Etiquetas: