Jump to content
Unity Insider Forum

UNET Multiplayer Tutorial: Ein kleiner Einstieg [#1]


Helishcoffe

Recommended Posts

Hallo Liebe Forengemeinde,

 

da ich in diesem Forum und auch im Internet noch keine wirklich ausführlichen Tutorials auf Deutsch zum Thema UNET gefunden habe und ich mich sowieso gerade mit dem Thema stark ausseinandersetze, möchte ich hier eine ausführliche Tutorialreihe zum Thema Multiplayer in Unity starten.

 

Ich werde mich hier nur mit der HLAPI beschäftigen die uns Unity ab Version 5 mitgegeben hat, da es denke ich mal für die meisten Interessanter sein wird und auch einfach umzusetzen ist.

 

Das Tutorial richtet sich an die, die sich noch nie mit dem Thema Multiplayer in Unity ausseinander gesetzt haben. Gewisse Scriptkenntnisse werden jedoch vorrausgesetzt.

 

 

Einführung: Wie funktioniert Multiplayer?

 

Es gibt viele Arten von Mehrspielern. Zum einen gibt es den Mehrspieler über Splitscreen, bei dem man den Bildschirm in der Mitte teilt, um so mehrere Spieler gleichzeitig an einem System zocken zu lassen. Darum soll es aber heute nicht gehen. Wir wollen mehrere Spieler an mehreren unterschiedlichen Systemen.

Unity bietet uns mit der HLAPI (HL -> High Level API) diese Möglichkeit.

 

Bevor man jedoch direkt loslegt, muss man sich voher jedoch fragen welche Art von Spiel man genau erstellen will. Soll es mal ein großes Multiplayer RPG werden mit hunderten von Spielern auf gigantischen Servern? Oder doch eher der kleine 5 gegen 5 auf Matchmaking basiertem Shooter?

Letzteres ist wohl das wahrscheinlichere Szenario, welches man mit der High Level API von Unitys UNET umsetzen wird. Größere Mutliplayer RPG's sind aufgrund der Struktur, wie die HLAPI aufgebaut ist eher schwierig umzusetzen. Allerdings hat Unity für solche Individuelleren Zwecke gleich eine zweite Schnittstelle mitgebracht: nämlich die LLAPI (LL -> Low Level API).

Um diese wird es jedoch in diesem Tutorial nicht gehen.

 

Doch wie funktioniert das jetzt genau?

 

Unity arbeitet mit dem Server-Client Modell. Das bedeutet, dass es einen zentralen Server gibt, der alle daten der Spieler verarbeitet und die Clients (also die Spieler), die ihre Daten an den Server senden und daten von ihm Empfangen. Man könnte den Server auch als eine Art Verteiler sehen, der alle Daten immer Synchronisiert.

 

serimg02.png

 

Ändert der Spieler z.B. seine Position im Spiel, so wird der Spieler (also der Client) seine neuen Positionsdaten an den Server senden. Der Server verteilt dann diese Positionsdaten an alle anderen Spieler, sodass sich alle Spieler gegenseitig an ihren jeweiligen Positionen befinden.

 

[ Bei mehr Interesse zum Thema Server-Client Modell: https://de.wikipedia...t-Server-Modell ]

 

Das besondere an UNet ist aber nun, dass die Aufgabe des Servers nicht unbedingt eine extra Rechenmaschine übernimmt, die irgendwo am Netz hängt sondern einer der Spieler selbst: der sog. "Host". Der Host ist Server und Client in einem. Das bedeutet, dass der Spieler der den Server betreibt wie ein Client gehandhabt wird, jedoch auch gleichzeitig die Aufgabe des Servers übernehmen muss.

 

Das hat den Vorteil, dass es nicht für jede Sitzung einen eigenen Server geben muss, der alles Verwaltet. Jeder Spieler ist also in der Lage, eine Sitzung zu starten.

 

 

 

Umsetzung in Untity

 

In Unity ist die Umsetzung sehr einfach gehalten.

Alles wird mit dem Network Manager geregelt, welchen man ganz einfach als Component an ein GameObject anhängen kann. Also: Add Component -> Network -> Network Manager

Nun kriegen wir folgendes zu sehen:

 

8ac61ccde7.png

 

 

Das sieht ersteinmal nach sehr sehr viel Input aus. Doch so kompliziert ist es gar nicht.

Gehen wir alles genau durch:

  • Dont Destroy On Load: bedeutet, dass das GameObject samt Network Manager beim wechseln der Scene im Spiel erhalten bleibt und immer verfügbar ist. Deswegen empfiehlt es sich den Network Manager in der Szene hinzuzufügen die als erstes geladen wird, damit der Network Manager die ganze Zeit vorhanden ist. Müsst ihr aber je nach dem was ihr für ein Spiel erstellen wollt, selbst wissen
  • Run in Background: Bedeutet, dass der Host die Daten weiterverarbeitet, selbst wenn ihr euer Spiel minimiert habt. Das ist für PC Spiele sehr empfehlenswert, damit die Welt nicht für die anderen Spieler einfriert, falls der Host mal das Spiel minimiert.
  • Log Level: Bestimmt nur, wieviel Infos ihr in der Konsole sehen wollt, wenn ihr euer Spiel testet
  • Offline Scene: Wenn die Verbindung abbricht oder ihr das Spiel verlasst, gelangt ihr zurück in diese Scene
  • Online Scene: Wenn ihr euch mit einem Server/Host verbindet ode man selbst eine Sitzung startet, so ist das die Online Welt in der sich dann die Spieler bewegen werden.

Jetzt geht es Weiter mit den Network Infos. hier werde ich nur die wichtigsten Dinge ausführlicher beleuchten:

  • Use Websockets: Für normale Anwendungen uninteressant, deshalb ausgeschaltet lassen
  • Network Adress: Die Ip-Adresse des Spielers mit dem sich Clients verbinden und/oder der Host seine Sitzung öffnet. "localhost" bedeutet, dass sich der Client mit dem Host auf euren Rechner verbindet. Also startet ihr euer Spiel einmal als Client und einmal als Host, so wird der Client mit der Ip "Localhost" oder auch "127.0.0.1" sich mit dem Host auf euren Rechner verbinden. Sollte Host und Client auf unterschiedlichen Rechnern laufen (wie es später ja im fertigen Spiel sein wird), so muss hier die IP eingetragen werden, von dem Host.
  • Network Port: Der Port, an dem der Host gebunden ist und mit dem sich der Client verbindet. Den kann man frei wählen, solange man keine belegten Ports blockiert. Meistens sind aber alle Ports über 1000 frei.
  • Server Bind To Ip: Wenn hier ein Häkchen gesetzt wird, so wird beim erstellen einer Sitzung der Host an diese IP-Adresse gebunden. Das bedeutet, dass der Host nur unter dieser Adresse erreichbar sein wird. Wenn die Bindung nicht besteht, so ist der Host an allen Netzwerkschnittstellen erreichbar (Sollte auch im Normalfall so bleiben)
  • Script CRC Check: Wenn ein Häkchen dran ist, so wird jedes mal geprüft, ob alle Netzwerkteilnehmer die gleichen Scripts benutzen, damit ein reibungsloser Datenaustausch stattfinden kann. Ist kein Häkchen drin, so könnten sich z.B. verschiedene Versionen eures Spiels verbinden. Das kann unter umständen zu Problemen führen.
  • Max Delay: Die Maximale Verzögerung bevor ein Paket versendet wird. Standartmäßig sind 10ms eingestellt
  • Max Buffered Packets: Die Maximale Anzahl an Datenpaketen, die Im Buffer pro Kanal enthalten sein können
  • Packet Fragmentation: Standartmäßig ist hier ein Häkchen drin. Da erlaubt Unity größere Pakete in kleinere Datenpakete aufzuteilen

Zu den Folgenden Punkten werde ich in folgenden Tutorials noch eingehen, wenn es ums Matchmaking gehen wird:

  • MatchMakerHost URI
  • MatchMaker Port
  • Match Name
  • Maximum Match Size

Als nächstes kommen nun die Spawn infos:

  • Player Prefab: Hier kommt euer Spieler Prefab rein. Unity kümmert sich selbst darum, dass die Spieler die sich neu verbinden auch bei jedem erscheinen und wieder verschwinden wenn sie das Spiel verlassen. Dafür muss hier das Spieler Prefab zugewiesen werden
  • Auto Create Player: Wenn kein Haken dran ist, so kümmert sich Unity nicht mehr um das erstellen des Player Prefabs für andere Spieler.
  • Player Spawn Method: Hier könnt ihr auswählen, an welchen Spawnpunkten eure Spieler beim Betreten der Online-Scene erscheinen werden. Mit Random wird ein zufälliger Spawnpunkt ausgewählt und mit Round robin geht es rei um.
  • Registered Spawnable Prefabs: Hier kommen alle eure Prefabs von Objekten rein, die Später über das Netzwerk gespawnt werden können. Dazu zählen eben alle Objekte, die zur Laufzeit erschaffen werden und nicht von anfang an da sind.
  • Mit Advanced Configuration könnt ihr noch weitere Einstellungen individuell zu einzelnen Channels vornehmen. Ist aber erstmal unwichtig.
  • Use Network Simulatior: Wenn ihr das Spiel auf einem Rechner testet, so kann man hier verschiedene Szenarien Simulieren um zu testen wie das Spiel bei bestimmten Situation reagiert (z.B. schlechte Verbindungen etc.)

Das war ja jetzt nun mal sehr viel Theorie. Doch jetzt haben wir genug wissen, um uns mit dem wesentlichen zu beschäftigen. Wie ihr schon gemerkt habt, passiert einiges was den Multiplayer angeht im Network Manager. Deswegen werden wir nun auch anfangen ihn richtig zu verwenden.

 

 

Eine Sitzung Starten.

 

habt ihr nun schön alles eingestellt in eurem Netowork Manager, so können wir nun ans eingemachte gehen. Zum Starten einer Sitzung erstellen wir ersteinmal ein Script mit einer Entsprechenden Methode:

 

public void StartHost()
{
 NetworkServer.Reset();
 NetworkManager.singleton.Host();
}

 

Als erstes Resetten wir unseren NetworkServer. Das heißt, wir stellen alles wieder auf Anfang, falls wir voher schon mal eine Sitzung gestartet haben. Mit NetworkManager.singleton können wir zu jederzeit auf unsere vorhin hinzugefügte Komponente zugreifen. Das heißt, dass wir den NetworkManager gar nicht erst zuweisen müssen sondern wir können mit dem singleton zu jederzeit auf unsere Instanz zugreifen. Das bedeutet gleichzeitig aber auch, dass es nur ein NetworkManager geben darf.

 

Wenn wir jetzt nun z.B. durch einen Button unsere Funktion StartHost() aufrufen, so wird direkt der Server gestartet, die Online welt wird geladen und der Spieler ist im Spiel. Das Laden der Scene übernimmt auch hier Unity wieder, da wir sie ja voher dem Network Manager zugewiesen haben. Man könnte jetzt nun sagen: Der Host ist Online und es können sich weitere Spieler verbinden.

 

Einer laufenden Sitzung Beitreten

 

Um jetzt als Spieler einer laufenden Sitzung beizutreten, muss der andere Spieler als Client kommen. Also erweitern wir unser Script um diese Funktion:

 

public void StartClient()
{
 NetworkManager mgr = NetworkManager.singleton;
 mgr.networkAddress = "localhost";
 mgr.networkPort = 7777;
 mgr.StartClient();
}

 

Hier müssen wir zuerst die IP-Adresse und den Port zuweisen, bevor wir uns verbinden, Je nach dem, welche IP und welchen Port der Server bzw. der Host benutzt, müssen wir diese hier angeben. Auch das kann z.B. über ein InputField regeln wo der Spieler dann die IP-Adresse selbst eingeben kann. Mit StartClient() wird der Spieler nun mit dem Host verbunden und bei erfolgreicher Verbindung wird auch bei dem Client die Online Welt geladen.

 

 

Natürlich können sich die beiden Spieler noch nicht richtig sehen und Dinge wie Position etc. werden noch nicht Synchronisiert. Aber wir wissen nun schonmal, wie wir eine Verbindung aufbauen und wie das Multiplayersystem von Unity ungefähr funktioniert.

 

Wenn das Interesse von euch da ist, so würde ich diese Reihe dann fortsetzen und mit dingen wie "SyncVars, Rpc-Calls und Commands" weitermachen.

 

Ich hoffe euch hat dieser schonmal kleine Einstieg gefallen :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke, find ich gut :)

 

Spiele die letze Zeit immer stärker mit den Gedanken mich demnächst mit UNET auseinander zu setzen und das gegebenenfalls mit VR zu kombinieren.

 

Das Tutorial ist sehr übersichtlich und leicht verständlich geschrieben. Gibt nichts zu bemängeln. Weiter so! :)

 

Danke, das freut mich :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 9 months later...

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Lädt...
×
×
  • Neu erstellen...