Unity Spain

Post Antiguos => General (Antiguo) => Mensaje iniciado por: farenhai en Mayo 24, 2016, 01:01:09 PM

Título: Networking
Publicado por: farenhai en Mayo 24, 2016, 01:01:09 PM
Hola, amigos y gurús de UnitySpain!
 
 
 
Os explico la situación: tengo varios GO (esferas) utilizadas como representación de ciudades. Cada una de estas ciudades tienen que compartir algunas variables como "población" a través de la red para que sean exactamente los mismo valores para todos los jugadores (estos variables se alteran con ayuda de variables Random). El problema es que, a la hora de hacer el networking, el valor de "población sale diferente en el host y en el cliente (segunda instancia). 
 
 
 
Había pensado como solución que sea el Pc del Host el que haga los cálculos de las variables y de ahí se derive al resto de clientes, pero... ¿cómo hago? He estado viendo la documentación (https://unity3d.com/learn/tutorials/topics/multiplayer-networking/adding-multiplayer-shooting?playlist=29690 (https://unity3d.com/learn/tutorials/topics/multiplayer-networking/adding-multiplayer-shooting?playlist=29690)  y  he seguido video ( https://www.youtube.com/watch?v=JlKf0h0K5PU (//%5Byoutube%5Dhttps://www.youtube.com/watch?v=JlKf0h0K5PU%5B/youtube%5D)   ; había empezado usando Photon (algunos videos adicionales junto con un tutorial que ahora no vienen al caso) , pero lo he descartado temporalmente porque me da  la sensación de que tampoco facilita tanto las cosas  -  si me equivoco, please, que alguien me corrija-). El caso es que todos los ejemplos que veo van orientados a la actualización de datos desde el cliente al servidor, mientras que yo lo que necesito es que sólo haya una instancia de esas variables que se distribuya desde el servidor a los clientes...  (si estoy errado, please, nuevemente, corrijan  ).
 
 
 
Por tanto, así cómo normalmente en la documentación y los tutoriales hacen uso de if(isLocalPlayer) y el uso de [Command] para identifical al jugador local, la dificultad mayor que tengo (si hasta este punto voy bien dirigido) es que no sé cómo decir  "if(isHost;  isServer , tal vez???? - No parece funcionar...) ... ¿Cómo puedo hacer para identificar al host?
 
 
 
Please!!! ¿Ayuda? ¿Documentación adicional? ¿"Cogotazo" por no enterarme de nada?    Me siento cual octópodo en un estacionamiento automovilístico...
 
 
 
¡Gracias!
Título: Networking
Publicado por: juanma_teso en Mayo 24, 2016, 10:41:37 PM
Prueba a hacer esto: Crea un objeto con networkIdentity y asigna un script al objeto, en este script crea una variable del tipo que quieras, ahora crea una función con el atributo ClientRPC, esta función se ejecutará sólo en el cliente, y otra función con el atributo Server, que se ejecutará sólo en el servidor o host, desde la función Server modificas la variable y la mandas mediante la función primera a todos los clientes.
 
http://docs.unity3d.com/ScriptReference/Networking.ClientRpcAttribute.html (http://docs.unity3d.com/ScriptReference/Networking.ClientRpcAttribute.html)
 
http://docs.unity3d.com/ScriptReference/Networking.ServerAttribute.html (http://docs.unity3d.com/ScriptReference/Networking.ServerAttribute.html)
 
Te dejo un ejemplo que acabo de hacer para comprobar un poco lo de arriba:
 

public class Test : NetworkBehaviour {
[SyncVar]
int numero;
// Use this for initialization
void Start () {
   
}

// Update is called once per frame
void Update () {
   Debug.Log (numero);
   if (Input.GetKeyDown (KeyCode.Space) && isServer)
      AumentarNumero ();
}
[Server]
void AumentarNumero ()
{
   numero++;
}
[ClientRpc]
void RpcActualizarDato (int n)
{
   numero = n;
}
}

 
El procedimiento es básicamente el mismo que para la inversa (los commands que habrás visto en los tutos), en algunos proyectos de ejemplo de Unity usan una función llamada setdirtybits pero todavía no sé bien como implementarla, espero que puedas salir del paso.
Título: Networking
Publicado por: farenhai en Mayo 25, 2016, 01:22:28 PM
¡Funciona de maravilla, Juanma!
 
Ahora toca rom*** los cuernos para adaptarlo a mi proyecto ...
 
¡Muchas gracias!
Título: Networking
Publicado por: juanma_teso en Mayo 25, 2016, 01:47:24 PM
Me alegro!! antes me he equivocado, un Rcp no se ejecuta sólo en el cliente, manda un "mensaje" al objeto en el lado cliente, te dejo una imagen que quizás te pueda ayudar:
 
(http://docs.unity3d.com/uploads/Main/NetworkAuthority.png)
 
Teniendo en cuenta que las ciudades no serán jugadores sino objetos npc como el Enemy tienes que tener en cuenta:
 

Poco más, cualquier duda aquí estamos.
Título: Networking
Publicado por: Trunex en Mayo 25, 2016, 02:59:31 PM
Yo no sé de dónde has sacado que photon no facilita las cosas, ya que lo que tú quieres hacer, en photon se haría con un sólo método OnPhotonSerializeView 
Título: Networking
Publicado por: farenhai en Mayo 25, 2016, 03:09:16 PM
Cita de: Trunex date=1464181171Yo no sé de dónde has sacado que photon no facilita las cosas, ya que lo que tú quieres hacer, en photon se haría con un sólo método OnPhotonSerializeView 
   


Ha sido sólo una impresión después de haberlo probado y haber comparado con el video que mostré. También pregunté si alguien lo recomendaba y si mi impresión era incorrecta... Perdón si herí sensibilidades de algún tipo...
 
 
 
Me queda claro que lo recomiendas. ¡Gracias!
Título: Networking
Publicado por: Trunex en Mayo 25, 2016, 03:26:44 PM
Cita de: farenhai date=1464181756Ha sido sólo una impresión después de haberlo probado y haber comparado con el video que mostré. También pregunté si alguien lo recomendaba y si mi impresión era incorrecta... Perdón si herí sensibilidades de algún tipo...
   
       
   
   
      Me queda claro que lo recomiendas. ¡Gracias!


Pero que sensibilidad?? xD
 
Y sí, te lo recomiendo, mucho más que el Unet.