unity3d
Vernetzung
Suche…
Bemerkungen
Headless-Modus in Unity
Wenn Sie einen Server für die Bereitstellung unter Linux erstellen, haben die Build-Einstellungen die Option "Headless-Modus". Eine mit dieser Option erstellte Anwendung zeigt nichts an und liest keine Benutzereingaben. Dies ist normalerweise das, was wir für einen Server wollen.
Erstellen eines Servers, eines Clients und Senden einer Nachricht
Unity-Netzwerke bieten die High-Level-API (HLA), um Netzwerkkommunikation von Low-Level-Implementierungen abzugrenzen.
In diesem Beispiel erfahren Sie, wie Sie einen Server erstellen, der mit einem oder mehreren Clients kommunizieren kann.
Mit dem HLA können wir eine Klasse problemlos serialisieren und Objekte dieser Klasse über das Netzwerk senden.
Die Klasse, die wir zur Serialisierung verwenden
Diese Klasse muss von MessageBase übernommen werden. In diesem Beispiel wird nur eine Zeichenfolge innerhalb dieser Klasse gesendet.
using System;
using UnityEngine.Networking;
public class MyNetworkMessage : MessageBase
{
public string message;
}
Server erstellen
Wir erstellen einen Server, der den Port 9999 überwacht, maximal 10 Verbindungen zulässt und Objekte aus dem Netzwerk unserer benutzerdefinierten Klasse liest.
Der HLA ordnet einer ID verschiedene Nachrichtentypen zu. In der MsgType-Klasse ist ein Standardnachrichtentyp von Unity Networking definiert. Beispielsweise hat der Verbindungstyp die ID 32 und er wird im Server aufgerufen, wenn ein Client eine Verbindung herstellt, oder im Client, wenn er sich mit einem Server verbindet. Sie können Handler registrieren, um die verschiedenen Nachrichtentypen zu verwalten.
Wenn Sie, wie in unserem Fall, eine benutzerdefinierte Klasse senden, definieren wir einen Handler mit einer neuen ID, die der Klasse zugeordnet ist, die wir über das Netzwerk senden.
using UnityEngine;
using System.Collections;
using UnityEngine.Networking;
public class Server : MonoBehaviour {
int port = 9999;
int maxConnections = 10;
// The id we use to identify our messages and register the handler
short messageID = 1000;
// Use this for initialization
void Start () {
// Usually the server doesn't need to draw anything on the screen
Application.runInBackground = true;
CreateServer();
}
void CreateServer() {
// Register handlers for the types of messages we can receive
RegisterHandlers ();
var config = new ConnectionConfig ();
// There are different types of channels you can use, check the official documentation
config.AddChannel (QosType.ReliableFragmented);
config.AddChannel (QosType.UnreliableFragmented);
var ht = new HostTopology (config, maxConnections);
if (!NetworkServer.Configure (ht)) {
Debug.Log ("No server created, error on the configuration definition");
return;
} else {
// Start listening on the defined port
if(NetworkServer.Listen (port))
Debug.Log ("Server created, listening on port: " + port);
else
Debug.Log ("No server created, could not listen to the port: " + port);
}
}
void OnApplicationQuit() {
NetworkServer.Shutdown ();
}
private void RegisterHandlers () {
// Unity have different Messages types defined in MsgType
NetworkServer.RegisterHandler (MsgType.Connect, OnClientConnected);
NetworkServer.RegisterHandler (MsgType.Disconnect, OnClientDisconnected);
// Our message use his own message type.
NetworkServer.RegisterHandler (messageID, OnMessageReceived);
}
private void RegisterHandler(short t, NetworkMessageDelegate handler) {
NetworkServer.RegisterHandler (t, handler);
}
void OnClientConnected(NetworkMessage netMessage)
{
// Do stuff when a client connects to this server
// Send a thank you message to the client that just connected
MyNetworkMessage messageContainer = new MyNetworkMessage();
messageContainer.message = "Thanks for joining!";
// This sends a message to a specific client, using the connectionId
NetworkServer.SendToClient(netMessage.conn.connectionId,messageID,messageContainer);
// Send a message to all the clients connected
messageContainer = new MyNetworkMessage();
messageContainer.message = "A new player has conencted to the server";
// Broadcast a message a to everyone connected
NetworkServer.SendToAll(messageID,messageContainer);
}
void OnClientDisconnected(NetworkMessage netMessage)
{
// Do stuff when a client dissconnects
}
void OnMessageReceived(NetworkMessage netMessage)
{
// You can send any object that inherence from MessageBase
// The client and server can be on different projects, as long as the MyNetworkMessage or the class you are using have the same implementation on both projects
// The first thing we do is deserialize the message to our custom type
var objectMessage = netMessage.ReadMessage<MyNetworkMessage>();
Debug.Log("Message received: " + objectMessage.message);
}
}
Der Kunde
Nun erstellen wir einen Client
using System;
using UnityEngine;
using UnityEngine.Networking;
public class Client : MonoBehaviour
{
int port = 9999;
string ip = "localhost";
// The id we use to identify our messages and register the handler
short messageID = 1000;
// The network client
NetworkClient client;
public Client ()
{
CreateClient();
}
void CreateClient()
{
var config = new ConnectionConfig ();
// Config the Channels we will use
config.AddChannel (QosType.ReliableFragmented);
config.AddChannel (QosType.UnreliableFragmented);
// Create the client ant attach the configuration
client = new NetworkClient ();
client.Configure (config,1);
// Register the handlers for the different network messages
RegisterHandlers();
// Connect to the server
client.Connect (ip, port);
}
// Register the handlers for the different message types
void RegisterHandlers () {
// Unity have different Messages types defined in MsgType
client.RegisterHandler (messageID, OnMessageReceived);
client.RegisterHandler(MsgType.Connect, OnConnected);
client.RegisterHandler(MsgType.Disconnect, OnDisconnected);
}
void OnConnected(NetworkMessage message) {
// Do stuff when connected to the server
MyNetworkMessage messageContainer = new MyNetworkMessage();
messageContainer.message = "Hello server!";
// Say hi to the server when connected
client.Send(messageID,messageContainer);
}
void OnDisconnected(NetworkMessage message) {
// Do stuff when disconnected to the server
}
// Message received from the server
void OnMessageReceived(NetworkMessage netMessage)
{
// You can send any object that inherence from MessageBase
// The client and server can be on different projects, as long as the MyNetworkMessage or the class you are using have the same implementation on both projects
// The first thing we do is deserialize the message to our custom type
var objectMessage = netMessage.ReadMessage<MyNetworkMessage>();
Debug.Log("Message received: " + objectMessage.message);
}
}