Jump to content
farenhai

Networking

Recommended Posts

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 :7_sweat_smile: ).

 

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? :4_joy:   Me siento cual octópodo en un estacionamiento automovilístico...

 

¡Gracias!

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

¡Funciona de maravilla, Juanma!

Ahora toca romperse los cuernos para adaptarlo a mi proyecto ...

¡Muchas gracias!

Share this post


Link to post
Share on other sites

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:

NetworkAuthority.png

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.

Share this post


Link to post
Share on other sites

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 

Share this post


Link to post
Share on other sites
hace 6 minutos, Trunex said:

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 

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... :4_joy:

 

Me queda claro que lo recomiendas. ¡Gracias! :10_wink:

Share this post


Link to post
Share on other sites
hace 16 minutos, farenhai said:

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... :4_joy:

 

Me queda claro que lo recomiendas. ¡Gracias! :10_wink:

Pero que sensibilidad?? xD

Y sí, te lo recomiendo, mucho más que el Unet.

Share this post


Link to post
Share on other sites

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