Jump to content
Unity Insider Forum

[Photon] Pong Ball nicht synchron zwischen Master und Client


NoAim

Recommended Posts

Moin Leute!

Ich arbeite derzeit an einem Multiplayer Pong Spiel. Für die Kommunikation nutze ich Photon. Während die 2 Spieler über die PhotonView und OnPhotonSerializeView funktionieren musste ich bei dem Ball eine andere Variante wählen, damit bei hohen Geschwindigkeiten der Ball nicht hin und her wackelt. Deswegen habe ich versucht über RPC Calls den Clients die richtigen Daten vom Master-Client zuzuschicken. Die Clients versuchen dann anhand der Daten vom Master-Client die Physik zu imitieren.

Wenn der Ball von der Mitte aus startet führe ich GoBall aus 

public void GoBall()
    {
        float rand = Random.Range(0.0f, 2.0f);
        if (rand < 1.0f)
        {
            rb2d.AddForce(new Vector2(30.0f, -15.0f), ForceMode2D.Impulse);
        }
        else
        {
            rb2d.AddForce(new Vector2(-30.0f, -15.0f), ForceMode2D.Impulse);
        }

        if (this.photonView.isMine)
        {
            this.photonView.RPC("onData", PhotonTargets.All, transform.position, rb2d.velocity);
        }
    }

Auf den anderen Clients wird dann dieser Codeschnipsel ausgeführt:

[PunRPC]
    public void onData(Vector3 position, Vector2 velocity)
    {
        Debug.Log("New Data: position: " + position.ToString() + "vel: " + velocity.ToString());
        transform.position = Vector3.Lerp(transform.localPosition, position, Time.deltaTime * 5);
        GetComponent<Rigidbody2D>().transform.position = Vector3.Lerp(transform.position, position, Time.deltaTime * 5);
        this.GetComponent<Rigidbody2D>().velocity = velocity;
    }

Die onData Funktion wird auch jedes mal aufgerufen, wenn der Ball einen Spieler trifft und abprallt.

Leider kommt es dabei zu einem großen Unterschied zwischen dem Master und dem Client. Teilweise springt der Ball hin und her, ist sehr stark verspätet.

Jemand einen Tipp wie ich das Problem lösen kann? Bin ich komplett auf dem Holzweg?

LG

NoAim

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich kenne mich mit den Unity Netzwerksachen nicht aus. Aber ich könnte mir vorstellen dass hier ein simplerer Ansatz eventuell "smoother" wäre. Korrigiert mich wenn ich mit meiner Einschätzung falsch liege:

Ich glaube die Netzwerk Bibliothek ist zu groß/schwerfällig/langsam für einen einfachen Ball, der in eine Richtung rollt, und dass möglichst in Echtzeit. Ich würde versuchen den Ball (also wirklich nur den Ball) in eine andere, schnellere Ebene zu holen. Am schnellsten wäre es natürlich einfach Peer to Peer über Sockets. Da würde es ja einfach reichen wenn du Startposition des Balls, Richtung (Vector) und eventuell noch die Geschwindigkeit versendest. Einfach die 5 floats in den Stream packen und flushen.

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich bin auch nicht der Netzwerkprofi, aber ein paar Tipps kann ich Dir geben. Erstens hängt natürlich die Verzögerung zwischen Client und Server von der Updaterate der Kommunikation zwischen Photonclient und Photonserver ab. Zweitens solltest du eine Prediction (Vorhersage) der Serverdaten vornehmen. Diese Vorhersage wird korrigiert nachdem die tatsächlichen (Positions-)Daten des Servers eingetroffen sind, tust du das nicht, hängt natürlich der Client immer dem Server hinterher. Zudem verzögert deine Lerpfunktion den Abstand zum Server zusätzlich (daher habe ich den Multiplikator verdoppelt).

Eine einfache Vorhersage kann man beispielsweise so treffen:

private Vector3 lastPosition;
private Rigidbody2D rb2d;

void Start() {
   lastPosition = position;
   rb2d = this.GetComponent<Rigidbody2D>();
}

public void onData(Vector3 position, Vector2 velocity)
{
   Debug.Log("New Data: position: " + position.ToString() + "vel: " + velocity.ToString());
   Vector3 currentDirection = position - lastPosition;
   Vector3 predictedPosition = position + currentDirection;
   transform.position = Vector3.Lerp(transform.position, predictedPosition, Time.deltaTime * 10);
   rb2d.velocity = velocity;
   lastPosition = position;
}

Bei komplexeren Vorhersagen nimmt man dann mehrere Punkte.
Zusätzlich würde ich auch die Velocity entsprechend zu den Positionsdaten behandeln, also ebenfalls vorhersagen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...