Noticias

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

Networking

Iniciado por farenhai, Mayo 24, 2016, 01:01:09 PM

Tema anterior - Siguiente tema
Mayo 24, 2016, 01:01:09 PM Ultima modificación: Mayo 25, 2016, 01:11:19 AM por pioj
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  y  he seguido video ( https://www.youtube.com/watch?v=JlKf0h0K5PU   ; 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!

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.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.

¡Funciona de maravilla, Juanma!
 
Ahora toca rom*** los cuernos para adaptarlo a mi proyecto ...
 
¡Muchas gracias!

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:
 

 
Teniendo en cuenta que las ciudades no serán jugadores sino objetos npc como el Enemy tienes que tener en cuenta:
 


  •    Cuando crees un objeto con su networkIdentity en el servidor se creará en todos los clientes, en tu caso una ciudad-esfera o varias ;)


  •    Si quieres mandar variables del servidor al cliente debes tener una función Rcp.


  •    Si quieres mandar variables del cliente al servidor debes tener una función Command.


  •    No es aconsejable usar funciones Rcp o Commands cada frame.


Poco más, cualquier duda aquí estamos.

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 

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!

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.

Etiquetas: