Noticias

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

[Solucionado] NetWorkManager enviar datos entre server y cliente

Iniciado por kaito, Diciembre 08, 2015, 10:37:58 PM

Tema anterior - Siguiente tema
Diciembre 08, 2015, 10:37:58 PM Ultima modificación: Diciembre 10, 2015, 11:40:07 PM por kaito
Llevo toda la tarde con el nuevo sistema de Networking de Unity 5.2, el NetWorkManager y no consigo establecer la conexion para enviar una cadena de texto, tipo chat.La misma aplicación puede hacer de Servidor y de Cliente. Abro dos ventanas con la misma aplicación en el mismo equipo, con el address localhost.Utilizo un método Command y otro ClientRpc para modificar la cadena de texto del chat. No sé si este es el método más adecuado. Este es el script:
using UnityEngine;
using UnityEngine.Networking;
using System.Collections;

public class EnviarFrases : NetworkBehaviour {

public string frases = "";

[Command]
void Cmdfrase(string str){

   this.frases += str + "\n";

}

[ClientRpc]
void Rpcfrase(string str){

   this.frases += str + "\n";

}

public void Editar(string str){

   this.frases += str + "\n";

   if(NetworkManager.singleton.IsClientConnected()){
      this.frases += "servidor" + "\n";
      //Es servidor
      Rpcfrase(str);

   } else if(NetworkManager.singleton.client != null){
      this.frases += "cliente" + "\n";
      //Es cliente
      Cmdfrase(str);

   }

}

}
Utilizo IsClientConnected para saber si es servidor, y si existe alguna instancia client para saber si es cliente. No sé si es el mejor método.Inicio el servidor o el cliente desde otro script mediante NetworManager.singleton.StartServer() y StartClient().Dejo el unitypackage del proyecto, para ver si alguien puede arreglarlo: http://www.speedyshare.com/uagyF/multiplayer.unitypackage">http://www.speedyshare.com/uagyF/multiplayer.unitypackage Al parecer si realiza la conexion. He sustituido IsClientConnected por una variable booleana, y ya funciona el chat pero solo por el lado del servidor.La función Command(llamada por el cliente) no se ejecuta  en el servidor.¿Cómo se ejecutaría una función en el servidor desde el cliente? 

Diciembre 11, 2015, 12:00:02 AM #1 Ultima modificación: Diciembre 11, 2015, 12:07:28 AM por kaito
Lo he solucionado utilizando los métodos Send y RegisterHandler del servidor(NetworkServer) y del cliente(NetworkClient). En lugar de utilizar métodos [Command] y [ClientRpc]Para poder enviar(Send) datos entre servidor-cliente, primero se debe crear una clase derivada de MessageBase(incluida en UnityEngine.Networking), donde añadimos los datos a enviar:
public class Message : MessageBase {

public string text;

}
A continuación, registramos el envio de los datos tipo Message mediante RegisterHandler(id,método). De este modo, diferenciamos cada tipo de envio por tipo de dato:
using UnityEngine;
using UnityEngine.Networking;
using System.Collections;

public class Server : MonoBehaviour {

// Use this for initialization
void Start () {

   NetworkManager.singleton.StartServer();
   NetworkServer.RegisterHandler(1005, ReceiveMsg);

}

void ReceiveMsg(NetworkMessage netMsg) {

   Message msg = netMsg.ReadMessage<Message>();
   NetworkServer.SendToAll(1005,msg);
   ActualizarFrases.singleton.Editar(msg.text);

}

}
Hemos registrado los envios de datos tipo Message con la id 1005, y el método ReceiveMsg.Para el equipo cliente he configurado otro tipo de método de recibo(ReceiveMsg):
using UnityEngine;
using UnityEngine.Networking;
using System.Collections;

public class Client : MonoBehaviour {

// Use this for initialization
void Start () {

   NetworkManager.singleton.StartClient();
   if(NetworkManager.singleton.client != null){

      NetworkManager.singleton.client.RegisterHandler(1005, ReceiveMsg);

   }

}

void ReceiveMsg(NetworkMessage netMsg) {
   
   Message msg = netMsg.ReadMessage<Message>();
   ActualizarFrases.singleton.Editar(msg.text);
   
}

}
 ________________________________________ Un solo equipo hace de servidor, para uno o varios clientes.Cada cliente envia al servidor el texto al pulsar Return, y el servidor vuelve a enviar a "todos" el texto recibido. 
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Networking;
using System.Collections;

public class ActualizarFrases : MonoBehaviour {

public Text text;
public UnityEngine.UI.InputField inputField;
public static ActualizarFrases singleton;

void Awake(){

   singleton = this;

}

void Update () {

   if(Input.GetKeyDown(KeyCode.Return)){

      Message msg = new Message(){ text = this.inputField.text };

      if(NetworkServer.active){

         this.text.text += this.inputField.text + "\n";
         this.inputField.text = "";
         NetworkServer.SendToAll(1005, msg);

      } else {

         if(NetworkManager.singleton.client != null){

            NetworkManager.singleton.client.Send(1005, msg);

         }

      }

   }

}

public void Editar(string str){

   this.text.text += str + "\n";
   this.inputField.text = "";

}

}
 Enlace de descarga: https://app.box.com/s/j5e8gl6k0mt88ihceysdz2zh9f6dxuvm">https://app.box.com/s/j5e8gl6k0mt88ihceysdz2zh9f6dxuvm 

Etiquetas: