[DB - RS]Photon | Synchronisation des déplacements

Pour les scripts écrits en C#
Règles du forum
Merci de respecter la NOMENCLATURE suivante pour vos TITRES de messages :

Commencez par le niveau de vos scripts
DB = Débutant
MY = Moyen
CF = Confirmé

Puis le domaine d'application
-RS = Réseau
-AL = Algorithmie

Exemple :

[DB-RS] Mouvement perso multijoueur
MATT
Messages : 13
Inscription : 26 Déc 2017 02:57

Re: [DB - RS]Photon | Synchronisation des déplacements

Message par MATT » 30 Déc 2017 01:25

Voilà j'ai un peu avancé sur le code que tu m'as proposé @yonathgames et j'ai regarder les articles de Narkos.

Je pense avoir compris le fonctionnement qu'il faut adopté pour que le serveur puisse communiquer les informations qu'il reçoit afin qu'il y est une synchronisation sur le jeu.
Il me semble que j'ai déjà essayé de mettre en oeuvre ce fonctionnement décrit dans les articles avec cet effet lerp qui consiste à simuler cette synchronisation.
J'ai pris le code disponible dans le package de photon, et même avec celui ci la synchro est mauvaise.


Voici ou j'en suis avec ton code @younathgames

Code : Tout sélectionner

    
    private Vector3 syncPosition;
    private Quaternion syncRotation;
    private Vector3 syncStartPosition;
    private float coef;
    private double m_LastNetworkDataReceivedTime;
    
    void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info)
    {
        if (stream.isWriting)
        {
            stream.SendNext(GetComponent<Rigidbody>().position);
            stream.SendNext(GetComponent<Rigidbody>().rotation);
            stream.SendNext(currentSpeed);
            stream.SendNext(isBoostAvailaible);

        }
        else
        {
            syncPosition = (Vector3)stream.ReceiveNext();
            syncRotation = (Quaternion)stream.ReceiveNext();
            currentSpeed = (float)stream.ReceiveNext();
            isBoostAvailaible = (bool)stream.ReceiveNext();
            m_LastNetworkDataReceivedTime = info.timestamp;

        }
    }


    private void SyncedMovement()
    {
        float lastSynchronizationTime = Time.time;
        float syncTime = 0f;
        float syncDelay = Time.time - lastSynchronizationTime;

        
        Vector3 syncEndPosition = syncPosition - transform.forward * currentSpeed * coef * syncDelay;
        Quaternion syncEndRotation = syncRotation;
        Quaternion syncStartRotation = GetComponent<Rigidbody>().rotation;

        if (first)
        {
            syncStartPosition = syncPosition;
            first = false;
        }
        else
        {
            syncStartPosition = GetComponent<Rigidbody>().position;
        }


        syncTime += Time.deltaTime;
        GetComponent<Rigidbody>().position = Vector3.Lerp(syncStartPosition, syncEndPosition, syncTime / syncDelay);
        GetComponent<Rigidbody>().rotation = Quaternion.Lerp(syncStartRotation, syncEndRotation, syncTime / syncDelay);
    }
J'ai juste remplacer les variables par celles qui devraient correspondre
Le soucis c'est que je ne sais pas par quoi remplacer le boolean "first". Est ce le moment ou les joueurs se déplacent ?
Voilà j'ai un peu de mal à comprendre l'intégralité du code, le coef c'est une valeur que je peux modifier comme bon me semble ? moveVertical ( currentSpeed sur mon code ) est bien la variable contenant la vitesse actuelle du joueur ?

Je galère vraiment avec cette synchro, si vous pouvez m'accorder encore quelques éclaircissements ça m'aiderait grandement.
Merci à vous.

yonathgames
Messages : 45
Inscription : 18 Sep 2017 17:44

Re: [DB - RS]Photon | Synchronisation des déplacements

Message par yonathgames » 01 Jan 2018 01:28

Salut!

Désolé pour les réponses lentes, je n'ai pas pensé à regarder le forum ces derniers jours.

Le first était mis en place car il y avait un problème d'instanciation en Vector3.zero et mon player faisait donc la "route" de ce point initial vers le point d'apparition ( il explosait avant d'arriver...). Tu peux essayer de faire sans car j'ai cru voir rapidement que les mises à jour de photon ont corrigé ce problème ( à voir...)
Je t'ai fait une copie de mon bloc de code sans trop regarder les détails. Il faut bien prendre en compte que les send et receive doivent concerner les données que tu veux suivre. Par exemple le isboostavailable et le speed ne sont peut-être pas nécessaires pour toi.

Après, je sais qu'il y a des réglages à faire dans le component photonView pour fluidifier les mouvements. Chez moi, le rigidbody est configuré en interpolate. le photonView est "fixed" et "unreliable on change".
Encore une fois, je te relate des souvenirs puisqu'il y a maintenant un peu de temps que j'ai passé cette étape. J'étais très calé à ce moment là, mais maintenant c'est un peu loin.

Narkos
Messages : 46
Inscription : 15 Août 2017 10:22
Localisation : Localisation impossible

Re: [DB - RS]Photon | Synchronisation des déplacements

Message par Narkos » 01 Jan 2018 19:03

Hello,

Je crois qu'il y a un soucis quand tu déclare ta variable "syncDelay" dans private void SyncedMovement():

Code : Tout sélectionner

private void SyncedMovement()
    {
        float lastSynchronizationTime = Time.time;
        float syncTime = 0f;
        float syncDelay = Time.time - lastSynchronizationTime;

        
        Vector3 syncEndPosition = syncPosition - transform.forward * currentSpeed * coef * syncDelay;
        Quaternion syncEndRotation = syncRotation;
        Quaternion syncStartRotation = GetComponent<Rigidbody>().rotation;

        if (first)
        {
            syncStartPosition = syncPosition;
            first = false;
        }
        else
        {
            syncStartPosition = GetComponent<Rigidbody>().position;
        }


        syncTime += Time.deltaTime;
        GetComponent<Rigidbody>().position = Vector3.Lerp(syncStartPosition, syncEndPosition, syncTime / syncDelay);
        GetComponent<Rigidbody>().rotation = Quaternion.Lerp(syncStartRotation, syncEndRotation, syncTime / syncDelay);
    }
Si je lis ton code correctement:
"syncDelay" vaudra toujours 0.
Donc "Vector3 syncEndPosition" sera faussé.
Et du coup "Vector3.Lerp(syncStartPosition, syncEndPosition, syncTime / syncDelay);" ne doit pas retourner la valeur attendue.

Je pense que "float lastSynchronizationTime = Time.time;" devrait se trouver à la fin de ta méthode, non au début.

MATT
Messages : 13
Inscription : 26 Déc 2017 02:57

Re: [DB - RS]Photon | Synchronisation des déplacements

Message par MATT » 01 Jan 2018 21:21

Bonsoir,

j'ai mis à jour le script et j'ai suivi vos conseils.

J'ai donc placé " lastSynchronizationTime " comme il se doit, j'ai réglé le rigid body et le photon view avec tout les réglages possibles mais j'arrive encore au même résultat ( saccades et joueurs légèrement en avance ou en retard sur leurs vrai positions. Ce ne sont pas des petites saccades, je m'en passerai si c'était le cas, et j'ai constaté que c'est toujours les mêmes peu importe le script ... )
J'ai tendance à croire que c'est une malédiction #laugh

Mon erreur est peut être du au fait que j'ai placé la fonction SyncedMovement dans le void Update car sinon elle n'était jamais appelée, je suppose que sa place est bien dans l'Update n'est ce pas ?

J'ai bien entendu attaché le script au PhotonView et voilà ou j'en suis :

Code : Tout sélectionner

    void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info)
    {
        if (stream.isWriting)
        {
            stream.SendNext(GetComponent<Rigidbody>().position);
            stream.SendNext(GetComponent<Rigidbody>().rotation);

        }
        else
        {
            syncPosition = (Vector3)stream.ReceiveNext();
            syncRotation = (Quaternion)stream.ReceiveNext();
            m_LastNetworkDataReceivedTime = info.timestamp;

        }
    }

    private void SyncedMovement()
    {
        float syncTime = 0f;
        float syncDelay = Time.time - lastSynchronizationTime;
        lastSynchronizationTime = Time.time;

        Vector3 syncEndPosition = syncPosition - transform.forward * currentSpeed * coef * syncDelay;
        Quaternion syncEndRotation = syncRotation;
        Quaternion syncStartRotation = GetComponent<Rigidbody>().rotation;

        syncTime += Time.deltaTime;
        GetComponent<Rigidbody>().position = Vector3.Lerp(syncStartPosition, syncEndPosition, syncTime / syncDelay);
        GetComponent<Rigidbody>().rotation = Quaternion.Lerp(syncStartRotation, syncEndRotation, syncTime / syncDelay);
    }
Voilou je peux fournir une vidéo du rendu ingame si nécessaire, merci et bonne année comme on dit =)

yonathgames
Messages : 45
Inscription : 18 Sep 2017 17:44

Re: [DB - RS]Photon | Synchronisation des déplacements

Message par yonathgames » 01 Jan 2018 23:37

Tu as essayé avec les méthodes UpdateNetworkedPosition() et UpdateNetworkedRotation() ?

C'est celles que j'appelle dans l'update en marche avant ( elles saccadent en marche arrière et SyncedMovement() saccade en marche avant).

MATT
Messages : 13
Inscription : 26 Déc 2017 02:57

Re: [DB - RS]Photon | Synchronisation des déplacements

Message par MATT » 02 Jan 2018 04:35

Oui c'est ce que j'ai essayé en tout premier mais il y'a des saccades et au bout d'un bref délai l'autre joueur est renvoyé au spawn et je ne le vois plus bouger.
J'ai fais un copier coller et j'ai supprimé

Code : Tout sélectionner

newPosition.y = Mathf.Clamp(newPosition.y, 0.5f, 50f);
car les joueurs ne doivent aucunement se déplacer selon l'axe y sauf pour la rotation bien entendu.
Merci bien

yonathgames
Messages : 45
Inscription : 18 Sep 2017 17:44

Re: [DB - RS]Photon | Synchronisation des déplacements

Message par yonathgames » 02 Jan 2018 12:52

Là je sèche un peu...
Tu devrais peut-être exposer ton problème sur le forum photon, ils sont très réactifs! :rouge:
Cela m'avait beaucoup aidé.

MATT
Messages : 13
Inscription : 26 Déc 2017 02:57

Re: [DB - RS]Photon | Synchronisation des déplacements

Message par MATT » 03 Jan 2018 02:38

Ah je vois ^^
Et bien j'avais déjà fait un topic la dessus mais aucune réponse =(
Je vais retenter ma chance, en tout cas merci pour l'aide, je donnerai des nouvelles si j'arrive à quelques chose de stable
++

yonathgames
Messages : 45
Inscription : 18 Sep 2017 17:44

Re: [DB - RS]Photon | Synchronisation des déplacements

Message par yonathgames » 05 Jan 2018 23:31

Alors, des progrès?
ça me chiffonne ton problème. J'aimerais avoir ton code de management du player (pour le faire avancer). Une vidéo serait pas mal non plus pour se rendre compte.
Je n'aime pas les problèmes sans solution... :rougefaché:

MATT
Messages : 13
Inscription : 26 Déc 2017 02:57

Re: [DB - RS]Photon | Synchronisation des déplacements

Message par MATT » 06 Jan 2018 08:59

Salut, merci à toi de prendre des nouvelles.
J'ai pas vraiment avancé sur ce problème.
Voici + ou - le rendu actuel (+ ou - car j'ai pris la video il y'a quelque temps mais c'est sensiblement pareil ) https://vimeo.com/248741471 , à savoir le joueur n'est pas à sa position exacte et avance et son déplacement n'est pas fluide.
J'ai posté un sujet sur Photon, pour l'instant rien de concret

Répondre

Revenir vers « (C#) CSharp »