Jump to content
Unity Insider Forum

Synchronisationsprobleme


Marc2

Recommended Posts

Hallo,

 

Ich habe nach ein paar Tutorials angefangen ein eigenes Spiel zu schreiben. Dabei hat mir das Netzwerk immer wieder Probleme bereitet, aber inzwischen hatte ich eine funktionierende Lobby und ein Minimalistisches Spiel, d.h. eine Spielfigur für jeden Spieler und ein NPC der vom Server gesteuert herumläuft.

Die Bewegungen und Aktionen von jeder Figur (neue Objekte gespawnt) sahen auf beiden Rechnern synchron aus.

Ich habe das Spiel weiter ausgebaut und musste jetzt feststellen, dass Synchronisationsprobleme auftauchen:

IndexOutOfRangeException: NetworkReader:ReadByte out of range:NetBuf sz:36 pos:36

 

Ich habe versucht letzte änderungen rückgängig zu machen, hat aber nicht funktioniert, ich hatte in der Zeit davor an den Fähigkeiten der Figuren gearbeitet und dabei das spiel nicht zusätzlich als client gestartet.

Auf seiten des Hosts sieht alles gut aus, der beigetretene Spieler wird angezeigt und reagiert nicht, als ob er nichts tut.

Auf seiten des Clients ist die eigene Spielfigur vorhanden, die nicht auf Benutzereingaben reagiert, der NPC ist verschwunden und der andere Spieler wird durch die Figur des NPC ersetzt, bewegt sich allerdings nicht. (Die beiden spieler kann ich nicht auseinanderhalten)

 

Wenn ich den NPC entferne sieht es so aus als ob alles funktioniert.

versuche ich eine kopie des NPC oder des SC zu machen kommt der Fehler sobald ich irgendeine änderung unternehme, beispielsweise Network Identity -> Local Player Authority auf aus schalten.

 

Wenn ich kein NPC habe sondern nur die 2 Spieler und ein neues Objekt erstelle, dann bekomme ich den Fehler, dass Objekte vertauscht werden. Ich habe ein neues Netzwerkobjekt erstellt: eine Kugel.

 

Eine der ersten Aktionen an dem Spiel war es einen Stein und ein cube einzubauen, welche, genau wie die neue Kugel, die zusätzlichen Komponenten:

-Rigidbody

-Network Identity

-Network Transform (Sync Rigidbody 3D)

haben. Jetzt hab ich festgestellt, dass die beiden Spieler ihre Figuren bewegen können, keine Fehler in der Konsole erscheinen, aber diese drei Objekte ihre Positionen vertauschen.

Beim Host steht alles wie im Scene-Editor plaziert.

Beim Client haben Stein, Kugel, Cube ihre positionen zyklisch vertauscht.

Ich habe auch den Client im Unity-Editor geöffnet, es werden nicht die Bilder vertauscht, sondern die Kugel mit dem Namen "NPCNeu" ist an der Stelle, an der der Cube beim Host ist.

 

 

Hat irgendjemand eine Idee die mir vielleicht weiterhelfen könnte?

Gibt es irgendeine Möglichkeit in Unity ein Objekt auf Netzwerksynchronisierbarkeit überprüfen zu lassen?

Ich vermute es gibt irgendwo irgendeine Eigenschaft, die Unity nicht schafft zu synchronisieren. Er packt alle interessanten Informationen in Packete die übers netzwerk übertragen werden, angekommen werden sie extrahiert, was zu einem problem führt und dann entweder Positionen an die falschen Objekte übermittelt werden oder ein problem in der Länge des Datenpakets auftritt, was zu obiger Konsolen-Fehlermeldung führt.

Link zu diesem Kommentar
Auf anderen Seiten teilen

So ein Problem hatte ich mal in einer Übung. Da wurde an 2 verschiedenen Rechnern gebuildet und es kam zu so witzigem verhalten.

 

Vielleicht nicht dein Problem, aber zumindest eine Warnung. Selbst wenn man exakt das gleiche macht an 2 Unity Versionen und dann kompiliert muss nicht das gleich rauskommen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke für die Antwort, aber das Problem ist vermutlich ein anderes.

Es funktioniert weder wenn ich es an zwei verschiedenen Rechnern teste (und dabei einmal win verwende und einmal linux) noch funktioniert es bei zwei instanzen an dem selben Rechner.

 

D.h.

-ich speicher die szene

-und das projekt

-klicke auf den Pfeil um das Spiel zu kompilieren/ in der Unity-Umgebung auszuführen.

-Verlasse den Testmodus.

-File > Build & Run, öffne dadurch eine instanz auf meinem PC und betrete die Lobby als Host

-klicke erneut auf den Pfeil und öffne die zweite Instanz des Spiels in der Unity-Umgebung und trete dem Spiel bei.

 

Bei meiner bisherigen Suche nach dem Problem bin ich bereits auf solche Warnungen gestoßen, wenn das Projekt auf zwei verschiedene versionen gebuildet wurde.

Aber zwischen dem build und dem Test habe ich nichts verändert.

 

Ich weiss nicht ob das damit zusammenhängt aber beim betreten der Lobby habe ich immer wieder Fehler.

Also nach obiger anleitung habe ich große chancen, dass ich in der Lobby kein "Lobby Player Prefab" erzeugt wird und es dementsprechend zu Fehlern kommt und das Spiel nicht gestartet werden kann.

In dem Fall starte ich es ein oder auch mehrere male erneut, bis für den client ein lobby player erzeugt wird. Erst dann klicke ich bei allen Spielern auf Bereit. In dieser Situation kommt es dann zu dem im ersten post beschriebenen Problem.

 

Bin für jede weitere anregung dankbar, ich weiss nicht was ich noch ausprobieren kann.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Oje ich bin so dumm!

Dein Ratschlag ist tatsächlich die Lösung.

Also es funktioniert wenn ich zweimal die gebuildete Version ausführe, also in zwei Fenstern auf meinem Rechner.

Das Problem war, dass ich immer versucht habe eine der Versionen in der Unity-Umgebung zu öffnen.

Ist meine Annahme falsch, dass man ein Netzwerkspiel auch in einer Instanz in der Unity-Umgebung öffnen kann, oder mach ich irgendetwas falsch?

Früher oder später werde ich wohl zu Bugs kommen. Denen komme ich am einfachsten auf die Schliche, wenn ich eine Konsolenausgabe habe, oder mir auch einfach in dem "Scene" Fenster die public Variablen von Scripten anschauen kann.

Außerdem habe ich es geschafft, dass ich den Code mit dem Visual Studio öffnen und Debuggen kann. So etwas ist praktisch, also wenn noch jemand ne Lösung hat wie ich so etwas machen kann wäre schön.

Ansonsten bin ich froh, dass es zumindest ohne "Entwickleransicht" funktioniert.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Oje ich bin so dumm!

Dein Ratschlag ist tatsächlich die Lösung.

Also es funktioniert wenn ich zweimal die gebuildete Version ausführe, also in zwei Fenstern auf meinem Rechner.

Das Problem war, dass ich immer versucht habe eine der Versionen in der Unity-Umgebung zu öffnen.

Ist meine Annahme falsch, dass man ein Netzwerkspiel auch in einer Instanz in der Unity-Umgebung öffnen kann, oder mach ich irgendetwas falsch?

Früher oder später werde ich wohl zu Bugs kommen. Denen komme ich am einfachsten auf die Schliche, wenn ich eine Konsolenausgabe habe, oder mir auch einfach in dem "Scene" Fenster die public Variablen von Scripten anschauen kann.

Außerdem habe ich es geschafft, dass ich den Code mit dem Visual Studio öffnen und Debuggen kann. So etwas ist praktisch, also wenn noch jemand ne Lösung hat wie ich so etwas machen kann wäre schön.

Ansonsten bin ich froh, dass es zumindest ohne "Entwickleransicht" funktioniert.

 

Also ich hab das tatsächlich genau so gemacht wie du damals. Also build and run und die zweite Instanz im Editor.

Bist du sicher, dass beim Build keine Fehler auftreten?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also ich hab das tatsächlich genau so gemacht wie du damals. Also build and run und die zweite Instanz im Editor.

Bist du sicher, dass beim Build keine Fehler auftreten?

 

Es kommen Warnungen, aber keine Fehler.

(Die meisten Warnungen kann man ignorieren und sind von der Form "Der Variable 'xyz' wird ein Wert zugewiesen, aber nie verwendet." oder auch "Nicht erreichbarer Code entdeckt", was daran liegt, dass ich dinge zu testzwecken vereinfacht habe.)

Außerdem gibt es noch Warnungen über veraltete Funktionen.

 

Mit 'Warnungen, aber keine Fehler' beziehe ich mich auf die Konsole in unity nachdem ich auf Build bzw. build & run geklickt habe. (und vorher auf clear um keine alten meldungen mehr zu haben)

 

Gerade hatte ich folgenden Fall, nachdem ich das Projekt nur geöffnet habe ohne etwas zu verändern.

Ich habe Build geklickt und in dem neuen Fenster nochmal auf Build.

Anschließend hab ich im projekt auf play geklickt und damit alle alten konsolenmeldungen gelöscht.

Also erneut Build, diesmal Build & Run (was kein unterschied machen sollte?)

die neue Instanz ist Host.

Im Projekt klicke ich auf run und trete bei -> Ich habe in der Lobby keine Figur, kann das spiel nicht starten, beende den Modus in Unity und klicke sofort erneut auf run.

Ich drücke auf genau die gleichen knöpfe und trete erneut bei, diesmal bekomme ich eine Figur (die Host-Instanz ist zwischenzeitlich NICHT neu gestartet worden)

Ich starte das Spiel und alles läuft wunderbar, jeder Spieler kann mit seiner Figur beim anderen synchron herumlaufen.

 

Ich beende den Host und die Instanz in der Unity-Umgebung und starte aus dem explorer nochmal die buildversion als Host.

Ich möchte den Fall reproduzieren, da es die letzten male ja nie geklappt hatte und ich eigentlich nichts verändert habe. Diesesmal habe ich wirklich überhaupt nichts im projekt geändert.

Also klicke ich erneut auf Run, und betrete die Lobby, diesmal habe ich bereits beim ersten Versuch glück und habe eine Spielfigur.

Also kann ich das Spiel direkt starten. Diesmal habe ich allerdings altbekanntes Problem. Für den Host scheint die Welt in ordnung.

Der Client kann nicht laufen, der Platz des NPCs ist leer, anstelle des Host-spielers wird die Figur des NPCs angezeigt.

 

Mich irritiert, dass da scheinbar ein Zufallsfaktor enthalten ist.

Entweder es ist ein Fehler in dem Projekt, sodass ein Client nicht Fehlerfrei beitreten kann, oder nicht, aber dann sollte es, egal wie oft ich die anwendungen neu starte ohne etwas zu verändern, immer das selbe Ergebnis geben.

Der PC würfelt ja nicht wirklich aus, ob er mich mitspielen lassen will oder nicht, also muss es noch irgendeinen Faktor geben, der den Sachverhalt verändert, der mir nicht bewusst ist.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...