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