Hallo, es ist schon ne Weile her, wo mir bei dem Thema geholfen wurde. Seit dem habe ich viele Erfahrung sammeln können.
Ich habe nun folgendes Problem. Es geht um das Unity 3D Engine. Und ich habe da mehrere kleine Multiplayertests schon gemacht. Ich habe auch einen Client-Side-Prediction erfolgreich implementieren können. Dabei war aber das Spiel so aufgebaut:
Player A sendet seine Position und zusätzlich seine Geschwindigkeit, wenn er sich bewegt. Player B nimmt die Daten auf und wendet es bei seinen RemotePlayer A an. Zusätzlich werden die Latenzen beachtet und die Geschwindigkeit und Position quasi eingeschätzt wo der Charakter mittlerweile sein könnte und wird dahin bewegt, falls die eingeschätzte Position zu sehr von der neuen Position ausweicht.
Nun, aber wollte ich anders vorgehen, damit ich so wenig wie möglich sende.
Bei dem jetzigen Multiplayer habe ich so gemacht, dass man über das Netzwerk nur die Inputs für W-S und A-D sendet. Ich sende dabei
-1, 0, 1.
Die anderen empfangen es und bewegen dann ihren Charakter durch das Netzwerk kommende Daten. Jetzt wollte ich dazu Client-Side-Prediction machen, aber folgendes Problem habe ich dabei:
- Sagen wir Player A drückt W und es wird 1 gesendet.
- Player A bewegt sich schon wobei Player B auch bereits bekommen hat, da er guten Ping hat und auf den RemotePlayer A "Script" wird logischerweise auch auf 1 gesetzt und bewegt sich.
- Plötzlich laggt Player B
- Player A und und RemotePlayer A bei Player B bewegt sich noch Synchron.
- Player A lässt W los es wird 0 gesendet und bleibt stehen, aber Player B bekommt es später darum bewegt der RemotePlayer A sich weiter und es ist nicht mehr Synchron.
- Bei Player B korrigiert die Position von RemotePlayer A, da je nach Situation die Position zum Korrigieren gesendet wird. Desync wurde korrigiert.
Die Inputs kann man quasi als Velocity annehmen.
Nun es hört sich teilweise ok an, aber das Problem ist, dass es im Spiel wirklich doof anschaut, wenn der RemotePlayer vorbei läuft. Das passiert übrigens bei einem Ping von 80. Es läuft manchmal vorbei und wird zurück gesetzt.
Nun habt ihr nen Tipp für mich oder eine Alternative wie ich das lösen könnte?
Ich will irgendwann nen Autoritativen Server machen und da will ich die Position nicht senden müssen, da ja der Server sagt wo der Spieler gerade ist. Bei dem hier geht es, aber um einen Cloudserver, wo es nicht möglich ist.
Außerdem habe ich noch ne Frage. Wie sollte sich denn ein Spiel bei einem Lagg verhalten. Es gibt ja Spiele, die bewegen sich bei einem Lagg trotzdem weiter oder werden eingefroren. Gemeint ist, wenn das Spiel plötzlich sowas anzeigt "Ping Timout: 30 Seconds to disconnect". Dann ist man eingefroren. Und dann gibt es welche, da läuft man weiter und wird, aber nach dem lagg wird es zurückgesetzt. Ich frage mich was die da denn senden oder empfangen, dass es so passiert.