Ich habe ein Multiplayer-Spiel und mache clientseitige Prognosen, aber manche Spieler können einen Trank trinken und werden unsichtbar ...
Das Problem ist, dass ich, wenn sie unsichtbar werden, nichts mit dem Kunden teile, von dem er wissen könnte, dass er da ist. Wenn ein Spieler also versucht, ein Feld zu betreten, das von einem unsichtbaren Spieler besetzt ist, sagt er voraus, dass er erfolgreich ist, und erhält dann eine hässliche Positionskorrektur vom Server gesendet.
Eine Lösung wäre, etwas zu teilen, damit der Kunde es sehen kann, aber dann könnten Hacker damit herausfinden, wo sich unsichtbare Spieler aufhalten und schummeln.
Übrigens habe ich die reguläre Bewegungsvorhersage bereits gelöst, sie funktioniert perfekt.
multiplayer
client-server
affiszervmention
quelle
quelle
Antworten:
Dies kann als Animationsproblem angesehen werden. Wenn eine Positionskorrektur vom Server zurückkommt, weil versucht wurde, in ein unsichtbares Objekt einzudringen, senden Sie nicht nur die Korrektur zurück, sondern auch ein Flag, das angibt, warum die Korrektur benötigt wurde. Anstatt dass ein Spieler rückwärts knallt, kann er eine "Woah" -Animation durchführen, bei der es glaubwürdiger aussieht, als wäre er gerade auf etwas gestoßen.
In Spielen, die diesen Ansatz verwenden, ist es nicht ungewöhnlich, Unsichtbarkeit (zumindest vorübergehend) von allem zu entfernen, auf das gestoßen wurde. Dies ist unter anderem ein Anreiz für unsichtbare Spieler, Massen zu vermeiden oder anderen Charakteren zu nahe zu kommen, wodurch die Häufigkeit verringert wird, mit der Kollisionen mit unsichtbaren Spielern auftreten. Selbst wenn Ihre Animation für diese Art von Kollision schwach (oder nicht vorhanden) ist, wird sie durch den unsichtbaren Charakter, der in Sichtweite gerät, etwas verdeckt und zeigt allen klar, was gerade passiert ist.
Die Animationsanforderung konnte beseitigt werden, indem die Unsichtbarkeit nicht aus nächster Nähe funktioniert. Dies gibt unsichtbaren Spielern einen noch größeren Anreiz, sich anderen Charakteren nicht zu nähern. Dies ist ein gängiger Ansatz für Stealth-basierte Spiele und KI (ersetzen Sie "unsichtbar" durch "für das Ziel nicht sichtbar") und ist in PvP-Spielen wie World of Tanks zu sehen. Sie müssen sich keine Gedanken über die Kollisionsreaktion mit unsichtbaren Zeichen machen, wenn Ihnen nichts Unsichtbares jemals nahe genug ist, um damit zu kollidieren (innerhalb der Latenzgrenzen).
Dracors Lösung, Kollisionen mit unsichtbaren Objekten einfach zu ignorieren, ist auch eine gute. Dies erfordert wiederum einige Animationen (für den unsichtbaren Spieler-Client), damit Objekte nicht nur durch den Avatar des Spielers auf seinem Bildschirm geschnitten werden. Wenn Sie nichts anderes tun, können Sie dafür sorgen, dass sichtbare Objekte immer unsichtbare Objekte verschieben, sodass der unsichtbare Spieler auf dem Server automatisch aus dem Weg geräumt wird, wenn jemand mit ihm kollidiert.
Unsichtbar-unsichtbare Kollisionen sind etwas kniffliger. Es kann vorteilhaft sein, nur Kollisionen zu deaktivieren, da niemand sehen kann, ob zwei unsichtbare Objekte zusammenschneiden (vorausgesetzt, mit "unsichtbar" meinen wir, dass beide Objekte nicht für denselben Client sichtbar sind). Wenn eines der Objekte sichtbar wird, kehrt es automatisch zur sichtbaren-unsichtbaren Kollisionsreaktion zurück (schieben Sie das unsichtbare Objekt weg).
Dies alles wird schwieriger, wenn Unsichtbarkeit komplizierte Mengen von Personen enthält, die wen sehen können. Die erste oder zweite Lösung oben ist wahrscheinlich die beste, wenn Sie sie brauchen. Nicht jedes Problem dieser Art braucht eine technische Lösung. Viele benötigen lediglich Designlösungen (z. B. erlauben Sie Ihren Designern diese Funktion nicht).
quelle
Ich sehe hier nur zwei Optionen, wenn Sie dem Kunden nicht mitteilen möchten, wo sich der unsichtbare Spieler befindet: 1) Sie ignorieren die Einheitenkollision für unsichtbare Spieler - eine einfache Lösung, und die Spieler könnten die unsichtbaren Spieler nicht anhand von finden Kollisionstests entweder. 2) Nachdem Sie sich für den vorhergesagten Pfad entschieden haben, senden Sie dem Server den vorhergesagten Pfad, korrigieren den Pfad selbst auf der Serverseite und senden dann den neuen Pfad zurück.
quelle
Wenn ich nichts falsch verstehe, ist die Lösung einfach. Senden Sie die Client-Informationen nicht an alle unsichtbaren Spieler, sondern nur an diejenigen, die sich in Reichweite befinden und innerhalb der Bewegungsgrenzen während des vorhergesagten Intervalls einer Kollision ausgesetzt sind. Mit anderen Worten, wenn der Client nur 200 ms in die Zukunft prognostizieren muss, senden Sie nur Informationen zu unsichtbaren Spielern innerhalb von
max_player_velocity units/sec * 1/5 sec
Einheiten entfernt.quelle