Wie kann ich zwei Rennspieler synchronisieren?

8

Ich arbeite an einem Unity-Handyspiel, ähnlich einer Multiplayer-Version von Temple Run . Ich sehe eine schwankende Netzwerklatenz (im Allgemeinen 200-500 ms) aufgrund der mobilen Plattform.

Die beiden Spielercharaktere laufen auf demselben Pfad und müssen einfache Aktionen (Springen, Rutschen, Einschalten usw.) ausführen, um Hindernisse zu überwinden.

Wenn eine Nachricht zu spät kommt, nimmt das Spiel der Remote - Spieler übergeben ein Hindernis. Dies funktioniert normalerweise gut, aber falls ein Spieler durch ein Hindernis getötet wird, möchte ich, dass der entfernte Spieler auf demselben Hindernis / derselben Position wie der lokale Spieler zu sterben scheint. Aufgrund der Latenz scheint der Remote-Player das Hindernis überschritten zu haben, bevor die Nachricht, die seinen Tod ankündigt, überhaupt eintrifft.

Wie kann ich die Spieler synchronisieren?


Ich habe versucht, den Remote-Player sofort wieder in die Todesposition des lokalen Spielers zu bringen, sobald die Todesmeldung eintrifft. Sie sieht optisch unangenehm aus und kann andere Synchronisierungsprobleme aufwerfen.

Zohaib Javed
quelle

Antworten:

10

Problemanalyse

Eine Echtzeitkommunikation über eine Verbindung mit hoher Latenz ist offensichtlich nicht möglich.

Sie können natürlich eine Illusion versuchen (wie Sie es tun, indem Sie den Remote-Player so erscheinen lassen, als ob er ein Hindernis passiert hat, wenn es noch nicht bekannt ist). Wenn diese Illusion fehlschlägt (wie Ihre, wenn der Remote-Spieler das Hindernis nicht tatsächlich passiert hat , sondern stattdessen gestorben ist ), kann nichts mehr getan werden.

das Problem

In einem Fall (wie hier), in dem das Scheitern der Illusion wirklich schlecht aussieht , ist es möglicherweise einfacher, die Fakten zu akzeptieren und einfach Ihr Bestes zu geben, um die Situation so darzustellen, wie sie tatsächlich ist.

Mögliche Lösung

Wie wäre es , den anderen Spieler buchstäblich zu verlangsamen, wenn seine Entscheidung Zeit braucht, um sich zu verbreiten?

eine Lösung

Jeder Spieler sieht ein Bild des anderen, aber dieses Bild verlangsamt sich, wenn es sich Hindernissen nähert, für die die Entscheidungsmeldung noch in der Luft ist. Erst wenn die Nachricht empfangen wurde, scheinen sie das Hindernis zu überwinden oder nicht zu bestehen. Nach dem Hindernis beschleunigt das Bild erneut, um aufzuholen, und verlangsamt sich bei Bedarf erneut für das nächste.

Bei einer Verbindung mit geringer Latenz trifft die Entscheidung bald ein und das Verlangsamen und Beschleunigen ist vernachlässigbar. Auf einem mit hohem Latenz - Anschluss, dies wird die anderen Spieler hinter ihnen zu hinken erscheinen, aber sicher , dass der wichtigere Spiel Zustand „ die dieses Hindernis überwunden hat“ ist für beiden Spieler konsistent.

Anko
quelle
Danke für deine Antwort. Wir haben die von Ihnen vorgeschlagene mögliche Lösung bereits ausprobiert, fanden sie jedoch aus folgenden Gründen nicht durchführbar: 1. Der erste Grund ist die hohe Geschwindigkeit meines Spiels. Um ein 200-ms-Fenster abzudecken, müsste ich den Remote-Player auf 1/4 Geschwindigkeit verlangsamen, was eine sehr unangenehme und sichtbare visuelle Anomalie verursacht, insbesondere in dem Fall, in dem der Player nebeneinander läuft. 2. Da die Latenz schwankt, ist es wirklich schwierig, die Geschwindigkeitsreduzierung für den Remote-Player zu berechnen, um sicherzustellen, dass die Nachricht eintrifft, bevor sie das Hindernis überquert.
Zohaib Javed
2
@ZahaibJaved Oft besteht die einzige wirkliche Lösung darin, die Latenz durch Animationen zu verbergen. Anstatt langsamer zu werden, wenn sie auf das Hindernis zukommen, sollten Sie in Betracht ziehen, vollständig am Rand anzuhalten und eine Animation "Bereit zum Springen" auszuführen, deren Wiedergabe eine volle Sekunde dauert. Sobald das "Haben sie es geschafft" -Paket durchgekommen ist, führen Sie den eigentlichen Sprung durch und lerp vorwärts zu ihrer tatsächlichen Position.
BlueRaja - Danny Pflughoeft
Entschuldigung für die späte Antwort. Die Lösung, die ich implementiert habe, war in der Start-Zwischensequenz, in der alle Spieler gesehen werden können. Der lokale Spieler ist immer auf der ersten Position. Nachdem die Zwischensequenz beendet ist. Ich bewege einfach den gesamten Remote-Player so weit nach hinten, dass sie etwas Zeit haben, um die Information zu erhalten, dass der lokale Player auf einem bestimmten Hindernis gestorben ist oder auf dem Pfad richtig rutscht oder springt. Und am Ende gibt es einen geraden Weg, auf dem ich die Spieler einfach wieder synchronisiere. Das Ergebnis wird also korrekt angezeigt.
Zohaib Javed
4

Um Ankos Antwort zu ergänzen, können Sie Ihr Spieldesign ein wenig ändern, indem Sie die Konsequenz des fehlgeschlagenen Hindernisses nach dem Fehler hinzufügen. Ein fehlgeschlagener Sprung führt beispielsweise dazu, dass Sie in einer Schlammpfütze landen, die den Spieler disqualifiziert. Auf diese Weise bemerkt der andere Spieler den Fehler, indem er sieht, wie der andere in den Schlamm fällt, während der Spieler, der versagt, ihn sofort sieht.

Hier ist ein schöner Blog-Beitrag zu diesem Thema (es ist nicht so aktuell, aber ziemlich interessant): Darrin Wests Zeitmanagement und Synchronisation .

Vaillancourt
quelle
1

Ist es für den lokalen Spieler so wichtig, die genaue Position des Todes des entfernten Spielers zu kennen? Angenommen, der Remote-Player konnte nicht über eines Ihrer Hindernisse springen und ist somit gestorben.

Der tote Spieler würde seinen Tod sofort sehen und vom Ort des Unfalls aus fortfahren. Hier ist nichts Magisches.

Der lokale Spieler (derjenige, der noch lebt und tritt) würde sehen, dass der entfernte Spieler das Hindernis erfolgreich passiert. Eine Todesmeldung würde eingehen. Der entfernte Spieler würde auf den Beinen stolpern, fallen und langsam verschwinden. Wenn Sie das nächste Mal die Position des Remote-Players kennen, wird der Player genau in diese Position eingeblendet und läuft wieder normal. In einem solchen Setup wären sich die Spieler der Latenz bewusst, aber die Latenz würde als ein Spielelement (Stolpern) dargestellt, anstatt ruckartig auftauchende und verschwindende Spieler.

Wenn die Geschwindigkeit der beiden Spieler konstant ist, die Laufbahn vordefiniert ist und die Zeit bekannt ist, die erforderlich ist, um sich von einem Sturz zu erholen, können Sie den verblassenden / verschwindenden Teil vollständig eliminieren. Stellen Sie sich einen entfernten Spieler vor, der an einem der Hindernisse stirbt. Die lokale Darstellung wird noch ausgeführt, wenn eine Benachrichtigung eingeht. Der Spieler stolpert sofort. Es braucht Zeit, bis sie aufstehen und wieder laufen. Tatsächlich dauert es so lange, als ob sie am Hindernis sterben würden. Wenn sie wieder in Betrieb sind, werden sowohl lokale als auch entfernte Positionen synchronisiert.


quelle