Jump to content
Unity Insider Forum

MMO


Kojote

Recommended Posts

Grüße!

Seit ein paar Monaten plane ich ein MMO und lese mich in die Materie ein. Leider komme ich nur schleppend vorran, da das Thema doch recht breit gefechert ist. Mein Ziel war bzw. ist ein MMO in Richtung World of Warcraft, jedoch viel viel einfacher und weniger komplex. Nun suche ich wie gesagt seit Monaten einen Start und wollte euch mal Fragen ob jemand ein paar Ratschläge hat oder Bücher bzw. Tutorials. Eigentlich wollte ich mir alles mit Smartfox aufbauen, tendiere nun aber eher Richtung Photon, aber selbst hier sind die Dokumentationen recht bescheiden. Es fängt ja schon damit an, wie hoste ich den Spaß? Auf einem Server ist klar und das viele dazu Putty benutzen auch, jedoch was dann? Einmal liest man, dass der Server nur die Daten verteilt und die eigentliche Software auf dem Rechner ist, dann wieder das das Spiel ja auf dem Server läuft. Ja brauch ich nun zwei Versionen? Eine auf dem Server und eine die die User bekommen oder? 

Ehrlich gesagt bin ich mit meinem Latein langsam am Ende, die Dokumentationen sind gelinde gesagt mehr als schlecht.

Hoffe ihr könnt mir etwas weiter helfen.

Grüße von Kojote

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich habe so nen Server noch nie aufgesetzt, somit kann ich dir zum Servergeschehen und den nötigen Tools nicht viel sagen.

Trotzdem kann ich etwas Licht ins Dunkle bringen.

Die ganz alte Variante war die, dass du ein netzwerkfähiges Spiel erstellt hast und kopien davon auf verschiedenen Rechnern hattest. Um ein Match zu starten, musste einer der Rechner den Server spielen. Er war also der Host. Alle anderen Rechner waren Clients. Dein Spiel musste nun einige Netzwerkbefehle drauf haben, um überhaupt mal ne Lobby aufzubauen und sich mit den anderen Rechnern zu verbinden. Es ist ja keine richtige Verbindung, aber man kannte die Rechneradressen, an die etwas gesendet werden mussten. Auf jedem Rechner lief das gleiche Spiel, aber nur auf dem Host/Master wurden Dinge gemacht, die nichts mit den Spielern direkt zu tun hatten. (Computergegner usw.)
 

Mit dem Photon Netzwerk und allen anderen ähnlichen Typen, läuft das Verbindungsmanagement jetzt nicht mehr Lokal auf dem Host Rechner, sondern auf einem Server, der alles nötige verwaltet. Natürlich muss das Spiel immer noch Netzwerkbefehle senden. Aber eben nicht zum Host Rechner, sondern zum Photon Server. Also im Endeffekt wurde jetzt das Matchmaking und alle Interpolationsberechnungen ausgelagert. Was das bedeutet, erkläre ich gleich.

Die dritte Variante ist die, dass es weiterhin ein Photon Netzwerk gibt, aber zusätzlich all das Spielgeschehen auf einem Server abläuft. Es ist jetzt also nicht mehr so, dass du deine Figur bewegst, dass auf deinem Rechner gemacht wird und dann das Ergebnis zum Server gesendet wird, damit alle anderen Rechner das auch mit kriegen. Nein. Jetzt sendest du nur den Befehl. Der Server macht dann die Bewegung bei sich und sendet dir (und allen anderen Rechnern) das Ergebnis zurück, was dann bei dir angezeigt wird. Na ja, nicht ganz, denn das Netzwerk ist zu langsam, alsdass  eine flüssige Bewegung dann zustande käme. Deswegen tut dein Rechner schon etwas.

Wie Funktioniert das in einem Netzwerkspiel:

Nimm mal an, du hast jetzt nur 2 Rechner verbunden und das Spiel ist ein ganz einfaches 1gegen1 Ballerspiel, wo sich nur die Spielfiguren und Geschosse bewegen. Es gibt keinerlei Bewegungsanimationen, sondern nur etwas, wobei man erkennen kann, in welche Richtung es guckt.
Ungefähr jede zehntel Sekunde (viel schneller ist ne Netzwerkverbindung nicht) wird die Position und die Ausrichtung jedes Players an die anderen Rechner übermittelt.
Damit du die anderen Player auch siehst, muss quasi je ein Zombi-Prefab der anderen Player in deiner Szene sein. Ist es noch nicht da, wird es instanziert. Zombie deswegen, weil sie sich selber nicht bewegen, sondern nur positionsinformationen von den anderen Rechnern bekommen. Du siehst also deinen Player, den du wirklich steuerst (z.B. mit Transform.Translate) und Zombiegegner, die durch das Netzwerk gesetzt werden. Das ist nicht schön, denn wärend du dich flüssig bewegst, stottern die Gegner und nehmen 10 Mal pro Sekunde eine andere Position ein. Für deine Mitspieler an den anderen Rechnern ist das genauso.
Um das zu umgehen, musst du die Bewegung interpolieren, bzw. extrapolieren werden. Dafür nimmst du also die letzte Positionsinfo vom Gegner in den Speicher und sobald die 2. Info kommt, berechnest du daraus einen weiteren Verlauf. Du ahnst jetzt also wo der Gegner beim nächsten Senden sein würde (extrapolation) und bewegst ihn in der 10tel Sekunde weich da hin (interpolation). Passt das nicht, musst du die Position korrigieren.
Du kennst das von älteren Spielen, wo die Gegner plötzlich woanders hin gebeamt wurden, weil eine Zeit lang keine Info gesendet wurde und sie jetzt doch ganz woanders sind, als vorberechnet wurde.
Diese Vorberechnung nimmt dir das Photon z.B. ab. Du musst also nur wenige Befehle nutzen um infos zu senden und brauchst auch nur wenige Befehle um mit der Info der anderen umzugehen.

Wenn jetzt einer der Spieler auf einen anderen schießt muss ja irgendwie ausgewertet werden, ob und wann der Schuss getroffen hat. Außerdem wird bestimmt auch ein Geschoss instanziert. Diese Instanz würde wahrscheinlich vom Erzeuger als echtes Objekt bewegt und von den anderen Rechnern als Zombie angesehen. Treffen würde das Objekt auf der Erzeugerseite aber einen Zombie. Auf der Playerseite eines anderen Spielers wäre das Geschoss aber ein Zombie. Jetzt geht's schon los. Wer soll einen Treffer auswerten?
In der Regel ist es der Erzeugerrechner, der das auswertet.
Aber da genau ist eben ein Problem welches zum Cheaten einlädt.

Jetzt kommen die Spiele-Server ins Spiel! Auf dem Server läuft quasi das gleiche Spiel aber da ist niemand, der irgendeine Figur steuert. Außerdem muss auf dem Server auch nichts großartig dargestellt werden. Der Server kann sich ganz auf das Berechnen konzentrieren.
Alle Auswertungen werden also nur auf dem Server gemacht, denn jeder Spieler und auch jedes Projektil ist ein Zombie auf dem Server . Der Server hört auf alle Infos der anderen Player, guckt selbst aber nur zu, interpoliert, berechnet und sendet das Ergebnis zurück. Nur er erkennt, ob jemand getroffen wurde und gibt die Info raus.

Es geht aber nicht nur um das Bündeln der Informationen und somit das vermeiden von Synchronisationsproblemen oder Cheaten. Es ist auch eine Entlastung jedes Rechners, denn der Rechner selber muss nun nicht mehr so viel berechnen und kann mehr Power für andere Dinge aufwenden.

Also:
Auf irgendeinem Medium muss eine Netzwerksoftware laufen, die gewisse Dinge für das Spiel tut. Das kann theoretisch jeder einzelne Rechner (gleichzeitig), es ist aber besser, wenn es gebündelt auf einem Server läuft. Wie z.B. beim Photon Netzwerk.
Bei jedem Netzwerkspiel steuert der einzelne Rechner nur seinen eigenen Player. Alle anderen Player werden aufgrund von Infos einfach nur positioniert und ausgerichtet. Um eine flüssige Bewegung zwischen den Infopaketen zu erhalten, muss die Bewegung interpoliert werden.
Sind andere Objekte im Spiel, die von keinem Player gesteuert werden und evtl. mit den Playern interagieren können, muss man beim Design entscheiden, welcher Rechner das tun soll.
Jeder einzelne Rechner kann gewisse Dinge übernehmen oder aber es tut nur einer.
Ein Client kann auch ein Server / Host sein. Er wäre dann ein virtueller Server, der Servertätigkeiten übernimmt, aber trotzdem auch Client ist auf dem gespielt wird.
Ein dedizierter Server wäre ein echter Server, auf dem das Spiel ohne eigene Spielfunktion läuft. Er verwaltet somit das Spiel der Clients und wertet gegenseitige Interaktionen aus.

Was wird gesendet/empfangen:
Ständig die Position und Ausrichtung des Players und aller sich bewegenden Objekte.
Jede visuelle Änderung, z.B. der Start einer Animation. Jedes neue Geräusch, wenn ein Objekt instanziert wurde und dann natürlich dessen Position und Ausrichtung. Jedes verschwinden eines Objektes und was sonst noch für die Player wichtig ist.

 

Ich hoffe, ich konnte etwas helfen.
Du musst dich trotzdem in die Materie einlesen, denn ich kenne da auch nicht alle Feinheiten. Hab zwar selber mal ein kleines Ballerspiel auf Photonbasis erstellt und ein wenig getestet. Aber das war alles recht überschaubar. :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Vielen Dank, dass hilft mir schon mal ne ganze Ecke weiter. :) Ich kannte nur von früher die oberste Version. Sprich das einer Hostet und alle anderen sind Clients. Aber jetzt kann ichs erst mal nachvollziehen, wie das eigentlich funktioniert. Auf jeden Fall erst mal nen sehr guter Ausgangspunkt, danke nochmals!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Um noch einmal nach zu harken, ich dachte immer, auf dem Server läuft immer das Spiel. Aber so wie ich es nun versteh, verhällt es sich so: (Bitte korregiert mich wenn ich falsch liege)

Auf dem Server werden nur die Daten verarbeitet, wenn kein Spieler Online ist, passiert auf dem Server auch nichts. Wenn sich einer einloggt und allein ist, rennt er auf seinem Rechner in der Landschaft herum und sendet diese Daten an den Server. Sollte nun ein zweiter Spieler hinzu kommen, wird wie Malzbie schon sagte, auf jedem Rechner der Online ist, ein Zombie erstellt.

 

Des weiteren noch ne andere Frage, speichern der Spielerdaten. Ich wollte gern Photon nutzen. Bin nun am grübeln ob ich die PUN Version nehme oder die Server Version wo ich selber hosten kann. Problem ist wieder ich brauch nen Windows Server und hier muss ja auch wieder für Sicherheit gesorgt werden, was mir Kopfschmerzen bereitet. Auf den Serveranbieter kann ich mich ja nicht verlassen. Hier könnte ich jedoch meine eigene Datenbank hosten, was ich bei Photon nicht kann, die Speichern keine Daten, sondern Tauschen nur die Daten der Spielerinformationen aus. Daten wie ID, Benutzername, In-Game-Käufe, ect. müsste ich ja wo speichern. Hab jetzt PlayFab entdeckt, aber nicht ganz billig. Gibts da noch andere Möglichkeiten?

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 23 Minuten schrieb Kojote:

Auf dem Server werden nur die Daten verarbeitet, wenn kein Spieler Online ist, passiert auf dem Server auch nichts.

Kommt ganz einfach drauf an, was du machst. Wenn in deiner Welt nichts passiert ohne Spieler, dann warum nicht. Wenn das Spiel aber zum Beispiel eine Wirtschaftssimulation hätte, dann muss die natürlich weiterlaufen, auch wenn kein Spieler da ist. Da gibt's nicht wirklich feste Regeln für.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Kojote,

ich arbeite seit 2011 an meinem "mmo" und habe in dieser Zeit eine Menge ausprobiert und bin in unzähligen Sackgassen gelandet. Aktuell arbeite ich mit UNet von Unity, dass bedauerlicherweise in naher Zukunft nicht weiter entwickelt wird. Dennoch werde ich bei UNet bleiben, weil mein Grundsystem mittlerweile viel zu weit fortgeschritten ist und ich glücklicherweise nur noch am Spielcontent arbeite.

Ich rate dir kleine Schritte zu tun und dich ersteinmal darauf zu beschränken, dass deine Spielfigur serverseitig bewegt wird. Das geht ganz hervorragend mit NavMesh und funktioniert im Groben ungefähr so:

  • Spieler drückt "W" um nach vorne zu gehen.
  • Der Client sendet einen Navigationspunkt vor der Spielfigur auf dem NavMesh.
  • Der Server prüft, ob der Navigationspunkt innerhalb des NavMesh ist und sendet die neue Position des Spielers an den/die Client/s zurück.
  • Der Client empfängt den neuen Navigationspunkt und führt die Bewegung aus.

Gleichzeitig speichert der Server die aktuelle Position in einer Datenbank in definierten Schreibzyklen. Der Vorteil hier ist ein relativer Schutz vor Cheatern, da die Bewegung und später auch jede weitere Spielmechanik auf dem Server ausgeführt wird und nicht auf der Spielerseite.

Hierzu gibt es eine Menge von Tutorials im Netz. Wenn du diese Grundschritte umsetzen kannst, wäre der nächste Schritt, simple Spielmechaniken drumherum zu stricken.

Und mach dir am Anfang nicht so viele Gedanken, was den Serverbetreiber angeht. In der Entwicklungsphase wirst du mehr Zeit damit verbringen, lokal auf deinem Rechner zu entwickeln und zu testen. Anfangs reicht eine SLQ-Lite Datenbank völlig aus. Die wird als Datei im Serververzeichnis erstellt und kann später, wenn es dann irgendwann soweit sein sollte auf MySQL umgemünzt.

Ehrlich gemeint und wichtig: Mach kleine Schritte.

Beste Grüsse

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...