Jump to content
UnitySpain
oscar363

Network 2 escenas diferentes

Recommended Posts

Lo que quiero hacer es en realidad muy simple, pero no encuentro la forma de hacerlo.

Estoy desarrollando un juego multijugador pero cada jugador se encuentra en una escena distinta con scripts diferentes. El juego consiste en que un jugador juega sin nada de información, y el otro jugador ve la información en su pantalla. Por lo que ambos tienen que hablar, sin poder ver la pantalla del otro, para poder ganar. Es un juego de colaboración.

Por lo tanto, necesito pasar valores del servidor al cliente, solo eso. Necesito enviarle una matriz de enteros al cliente. Que un script "s1" en la escena A del servidor llame a una función del script "s2" en la escena B del cliente, pasándole enteros. Nada complicado. Enviar ints de servidor a cliente es lo más básico.

Conocía el antiguo sistema de network de unity (llamadas RPC), pero ahora que han cambiado al nuevo sistema "UNET" toda la información que encuentro en internet es sobre sincronizar transforms para poder tener distintos players en una misma escena, como si quisiera hacer un Counter Strike, yo no quiero hacer nada de eso.

Así que, sabeis cómo enviar valores de servidor a cliente, que se encuentran en diferentes escenas con diferentes scripts?

Otra cosa que no me queda clara son las nuevas componentes: network manager, network identity, network transfrm... Cuáles necesito para hacer esto y dónde?

Gracias de antemano por la ayuda.

Share this post


Link to post
Share on other sites

Todo objeto que herede del NetworkBehaviour tiene la ventaja de que queda sincronizado entre los distintos jugadores. Es decir, es como tener un objeto polimórfico a nivel de datos. Contiene tus datos, más todos los de los otros jugadores activos. Para acceder a los datos particulares "filtras" por tu identidad para recogerlos y los modificas. Unity se encargará de sincronizarlos con el resto.

https://docs.unity3d.com/Manual/class-NetworkBehaviour.html

Share this post


Link to post
Share on other sites

No entiendo por qué pretendes tener los jugadores en escenas diferentes, tampoco sé si se pueda, ten en cuenta que aunque estén los jugadores en la misma sala no tienen porqué ver lo mismo.

Enviar valores del servidor al cliente es bien sencillo como supones, basta con llamar una función ClientRPC desde el servidor, a estas alturas habrá muchos ejemplos, incluso en el foro creo, para comunicarse entre escenas no se me ocurre como hacerlo sin estar cambiando de escena, y al cambiar de escena el UNET reconecta a los clientes (si se usa el NetworkManager).

Con NetworkManager, NetworkIdentity y con un componente que herede de NetworkBehaviour como te han comentado podrías enviar y recibir variables.

Te sugiero que primero consigas enviar y recibir datos entre un cliente y un servidor, luego busca la manera de que los jugadores vean en sus pantallas cosas diferentes.

Share this post


Link to post
Share on other sites

Al final lo estoy haciendo con el sistema viejo de RPC, que me avisa que está obsoleto pero sigue funcionando. Con ese sistema, es realmente fácil hacer lo que propongo, y no estoy teniendo ningún problema. Aún así me gustaría saber cómo hacerlo con el nuevo sistema.

Respondiendo a @iRobb, gracias pero todo lo que me has contestado ya lo sabía, pero no me contestas la pregunta de cómo hacerlo si estoy en escenas diferentes, con scripts diferentes.

Y a @juanma_teso, primero, necesito que estén en escenas separadas porque en una hay muchas cosas (suelo, player, objetos, muchos scripts etc) mientras que el otro está vacío, muestro la información por GUI, así que solo tengo una cámara con un script. Por supuesto puedo hacer que el cliente también tenga la escena del servidor y tapar la vista con el GUI, pero me parece estúpido que el cliente tenga que tener todos esos objetos innecesariamente, para nada... no es muy eficiente.

Para que entendáis mejor lo que quiero hacer, el juego es un buscaminas en 3D. Un jugador es un soldado que camina por un campo de tierra y tiene que llegar hasta la salida sin pisar ninguna mina. Lo que el otro jugador, su compañero, ve en pantalla es la cuadrícula resuelta del buscaminas, con los números y marcas donde hay minas. Cada uno no puede ver la pantalla del otro, así que el Client que ve la cuadrícula/mapa en su pantalla tiene que darle indicaciones al Server, que mueve al soldado 3D por el campo de minas, para que se mueva sin pisar ninguna.

Por lo que además, no necesito que el client y el server estén comunicándose y sincronizándose contínuamente, solo necesito que el servidor le envía una matriz (el campo de minas) al client al principio de la conexión y ya.

Es parecido al juego (no sé si lo conocéis) de desactivar una bomba, en que un jugador ve la bomba y el otro las instrucciones para desactivarla, y tienen que hablarse para lograrlo. La idea es la misma.

Edited by oscar363

Share this post


Link to post
Share on other sites

Ni idea de online asi que tampoco me hagas mucho caso xD, y si antes de cargar las respectivas escenas creas un gameobject con algun script donde guardar los datos que necesites con un DontDestroyOnLoad y luego cargas las diferentes escenas???Ese gameobject se mantendria entre la carga de escenas,hasta que lo destruyas tu,asi lo utilizarias como un manager de la partida y solo tendrias que tener sincronizado los datos de ese gameobject.

Repito que n idea de online XD pero supongo que tendria que funcionar.

Saludos!

Edited by hammer

Share this post


Link to post
Share on other sites
hace 22 minutos, hammer said:

Ni idea de online asi que tampoco me hagas mucho caso xD, y si antes de cargar las respectivas escenas creas un gameobject con algun script donde guardar los datos que necesites con un DontDestroyOnLoad y luego cargas las diferentes escenas???Ese gameobject se mantendria entre la carga de escenas,hasta que lo destruyas tu,asi lo utilizarias como un manager de la partida y solo tendrias que tener sincronizado los datos de ese gameobject.

Repito que n idea de online XD pero supongo que tendria que funcionar.

Saludos!

Nah, de hecho es buena idea lo que me comentas, no lo había pensado. El único problema es que, luego ese script se tiene que relacionar con otros scripts y elementos de la escena. Pero como precisamente son 2 escenas diferentes con elementos diferentes, en cada una hay una cosa. ¿Me explico? El mismo script que permite a un jugador moverse por el mapa tendría que ser el mismo que mostrara la información del otro jugador en pantalla. Entonces todo sería el mismo script, y seria la misma escena... Pero buena idea, gracias. Seguro que dándole vueltas se puede lograr.

Igualmente, he logrado hacerlo bastante bien y fácil con el viejo sistema de RPC, me alegro mucho que Unity a pesar de nombrarlo obsoleto lo deje funcionando, ya que para cosas como estas me parece más simple este método. Me voy a quedar con este.

Share this post


Link to post
Share on other sites

×
×
  • Create New...