Jump to content
Unity Insider Forum

Synchronisation von "Nicht-Spieler-Objekten" durch wechselnde Ownerships?


AniProGuy2

Recommended Posts

Hallo liebe Community,

ich arbeite ja bereits seit einiger Zeit an einem Spiel, welches ich durch PUN netzwerkfähig machen möchte. Dabei handelt es sich allerdings um meinen ersten Versuch, Networking in einem Spiel umzusetzen und dementsprechend bin ich auf diesem Gebiet auch noch ein Anfänger (wobei ich schon einiges gelernt habe, in den letzten Monaten). Nun stellt sich mir allerdings eine grundsätzliche Frage zum Thema "Synchronisation" für mein Spiel.

Und zwar ist die Synchronisation von Spieler-Objekten in meinen Augen noch verhältnismäßig simpel. Client A hat seinen Spieler und auf diesem Spieler lasse ich alle wichtigen Funktionen laufen, deren Auswirkungen (Animationen hauptsächlich) ich dann auf allen anderen Clienten für dieses Spieler-Objekt nachmachen lasse (dafür kann ein Spieler-Objekt immer im aktiven und im nicht-aktiven Modus sein, sprich selbst aufführen oder nachmachen). Damit gibt es soweit eigentlich auch keine Probleme.

Was mir allerdings Kopfschmerzen bereitet, sind Nicht-Spieler-Objekte. In meinem Spiel sind diese ein essentieller Bestandteil des Grundkonzeptes. So gibt es z.B. Baumaterial wie Holz oder Steine und auch Waffen wie Bomben, die als Objekte in der Landschaft herumliegen, und mit denen jeder Spieler interagieren kann (z.B. diese aufsammeln). Nun ist für mich die Sychronisation dieser Objekte ein großes Fragezeichen. Und zwar ist es meines Wissens nach ja so, dass die Position eines Objektes - nehmen wir einmal das Spieler-Objekt - immer von Besitzer des Objektes hin zu den anderen Clienten synchronisiert wird. Sprich, wenn Client A seinen Spieler bewegt, wird diese Bewegung zu allen anderen Clienten synchronisiert. Allerdings haben besagte Nicht-Spieler-Objekte ja eigentlich keinen Besitzer, da jeder Client das gleiche "Anrecht" auf sie hat, sprich mit ihnen interagieren und sie aufsammeln kann. Somit steht nicht statisch fest, von welchem Clienten aus z.B. ihre Position zu den anderen Clienten synchronisiert werden muss. Und genau das ist für mich das Problem.

Mein bisheriger Lösungsweg sieht folgendermaßen aus: Wird eines dieser Nicht-Spieler-Objekte von einem Spieler aufgesammelt, wird automatisch dieser Spieler zum neuen "Besitzer", was via "Ownership Transfer" in PUN umgesetz wird. Die Position dieses Objektes und auch die Berechnungen im Objekt werden nun von besagtem Spieler aus sychronisiert (das Aufsammeln dieser Objekte stellt in meinem Spiel glücklicherweise in den meisten Fällen die Grundlage einer Interaktion mit ihnen dar).
Sammelt ein Spieler also nun eine Bombe auf und wirft diese auf einen anderen Spieler, ist das Treffen der Bombe und somit der entsprechende Schaden für den anderen Spieler, davon abhängig, ob die Bombe in der Version des "Aufsammlers" auch wirklich trifft. Das liegt daran, dass das Treffen und all seine Konsequenzen (Explosion, Schade, Zerstörung der Bombe) nur bei dem "Aufsammler" be,-und errechnet werden und zu allen anderen Clienten nur sychnronisiert wird (der Aufsammler ist ja wie bereits gesagt der Besitzer).

Das Prinzip is also gleich dessen der Spieler-Objekte, nur dass der Besitzer nicht mehr statisch ist, sondern durch das Aufsammeln eines Objektes wechseln kann. Somit ist eine Sychronität dieser Objekte (sofern ich es richtig umsetze ;P) immer gewährleistet. Alleridings ist es auch möglich, dass in der Version des Aufsammlers die Bombe aus besagtem Beispiel trifft und Schaden macht, aber in der Version des Ziels dies gar nicht der Fall ist (durch einen Lagg oder aus anderen Gründen). In diesem Fall ist also der Besitzer im Vorteil.

Meine eigentliche Frage ist nun:
Haltet ihr dieses Konzept für sinnvoll? Oder gibt es da viel bessere Lösungswege? Oder habe ich da etwas komplett falsch verstanden und es ist eigentlich ganz einfach? ^^

Ich bin dankbar für jede Hilfe! :)

mfG,
AniProGuy2

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich bin kein Netzwerkprofi, aber deine Theorie klingt für mich schlüssig. Ich kenne PUN nicht im Detail, aber deine beschriebenen Probleme kommen zum Teil daher, daß du quasi keinen authorativen Server hast, der den "Ownership" eines gespawnten Netzobjektes übernimmt und du damit immer einen Spieler als Owner bestimmen musst. Dies wird aber impliziert durch die verwendete Methodik von PUN, d.h. keinen authoritativen Server, der alle Zustände gespawnter Netzwerkobjekte definiert und vorgibt (wenn ich das richtig verstanden habe). sondern der PUN-Server stellt "nur" eine eindeutige Verbindung (PUN-Views) zwischen den Spielern (Clients) her und ordnet diese immer einer eindeutigen Identität zu (Lobby / Room / Groups / ViewID). Da dir also der Server fehlt, wird quasi immer ein Spieler zu "deinem Server" (Masterclient) und damit bestimmt auch immer ein Spieler den Zustand eines gespawnten Objektes.

PS:
Den (großen) Nachteil von PUN sehe ich allerdings nicht in der Methodik selbst, sondern eher in der Cheatanfälligkeit. Manipuliert ein Spieler seinen Client, kann er damit die Zustände den Spieles beeinflussen (und auch die anderen Mitspieler), was bei der Verwendung eines authorativen Server sehr erschwert wird, da hier der Server die Zustände der Clients noch einmal zusätzlich kontrollieren kann oder sogar sämtliche Zustände und "(Physik-)Simulationen" (bspw. Geschosse) selbst durchführt und damit nicht der Spieler entscheidet, ob beispielsweise ein anderer Spieler getroffen wurde. Die Clients dienen dabei mehr oder wenig nur noch als bessere "Eingabegeräte" und "Ausgabegeräte" und der Server simuliert sämtliche Zustände innerhalb des Spiels (es gibt aber denke ich auch "Teillösungen") Allerdings kostet diese Umsetzung wesentlich mehr Entwicklungsaufwand. Ich denke aber gelesen zu haben, daß auch mit Photon ein authorativer Server möglich ist:
https://doc.photonengine.com/en-us/onpremise/current/reference/authoritative-server

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also das mit dem authorativen Server klingt natürlich logisch und auch mehr als wünschenswert. Allerdings bin ich mir nicht sicher, inwiefer nich das umsetzen kann, da wie gesagt meine Fähigkeiten in diesem Bereich noch nicht so ausgereift sind. Allerdings werde ich mir das definitiv einmal ansehen und eventuell auch einmal ausprobiere (je nachdem, wie schwierig das ist).

Aber ansonsten ist meine Variante nachvollziehbar, bzw. logisch, oder? Es ist natürlich sehr cheatanfällig, das ist richtig und leider wohl auch mit meiner Umsetzung nicht wirklich vermeidbar :(

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...