[Resolu]Probleme Synchronisation multiplayer

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
EmileF
Messages : 673
Inscription : 18 Mars 2017 19:39

[Resolu]Probleme Synchronisation multiplayer

Message par EmileF » 31 Jan 2020 18:06

bonjour à tous,

J'ai un petit problème qui me titille depuis plusieurs jours et que je n'arrive pas à régler.
Je fais appel à la communauté pour essayer de trouver une solution.
Je créer un jeu multiplayer de lettres dans lequel la même grille doit s'afficher pour chaque player.
Tout va bien sauf que chaque player a une grille différente.
voila le script

Code : Tout sélectionner

using UnityEngine;
using UnityEngine.Networking;

public class Player : NetworkBehaviour
{
    int size;
    int count;
    string DataL = "AAAAAAAAAABBCCDDDEEEEEEEEEEEEEEEFFGGGHHIIIIIIIIIJKLLLLLMMMNNNNNNOOOOOOPPQRRRRRRSSSSSSTTTTTTUUUUUUVVWXYZ";

    //La variable de synchronisation crée par la commande CmdGrille
    //et qui appelle Initialise chez les clients
    [SyncVar(hook = "Initialise")]
    string grille;

    //Appel de synchonisation de la variable grille
    //qui doit permettre de créer la même grille chez tous les players
    void Initialise(string _grille)
    {
        grille = _grille;
        print(grille);
        //C'est ici que j'afficherai ma grille
    }

    //Commande Cmdgrille sensée ne s'exécuter que chez le server
    //pour créer un string qui représentera les lettres de la grille
    [Command]
    void CmdGrille()
    {
        size = 5;
        int count = size * size;
        string g = "";
        for (int i = 0; i < count; i++)
        {
            int v = UnityEngine.Random.Range(0, DataL.Length);
            g += DataL[v];
        }
        grille = g;
    }

    private void Update()
    {
        //On attend la pression d'espace
        if (Input.GetKeyDown(KeyCode.Space))
        {
            //si c'est le server
            if (isServer)
            {
                //execute la commande CmdGrille
                CmdGrille();
            }
        }
    }
}

J'ai commenté le script pour expliquer comment j'ai compris ce qui se passe.

Y aura-t-il quelqu'un qui pourra me dire ce que je n'ai pas compris
Dernière édition par EmileF le 03 Fév 2020 21:20, édité 1 fois.
La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

djulio74
Messages : 682
Inscription : 19 Déc 2009 22:55

Re: Probleme Synchronisation multiplayer

Message par djulio74 » 31 Jan 2020 19:21

Alors je n'y connais absolument rien en Network qu'on se la dise, mais du coup ma compréhension du script :

tu initialise ta grille chez le client, sous forme d'un string. mais ce string n'est pas encore défini puisque tu ne le fait uniquement lors de l'appui sur Espace chez le server. non?
Ne devrai tu pas faire ta Cmdgrille chez les server, et ensuite seulement initialiser la grille chez le client?

essaye peut être de garder la CmdGrille chez le serveur avec "Espace", et mettre une autre fonction chez le serveur genre sur "entree" ça lance Initialise pour récupérer la variable "grille" chez le serveur.

______________________________________________________________
\_______________________ Impossible is nothing _______________________/

EmileF
Messages : 673
Inscription : 18 Mars 2017 19:39

Re: Probleme Synchronisation multiplayer

Message par EmileF » 31 Jan 2020 19:40

Ben je crois avoir compris que c'est le serveur qui s'occupe de synchroniser le string pour tous les joueurs.
Djulio a écrit :tu initialise ta grille chez le client, sous forme d'un string. mais ce string n'est pas encore défini puisque tu ne le fait uniquement lors de l'appui sur Espace chez le server. non?
Pour ça OK
Djulio a écrit :Ne devrai tu pas faire ta Cmdgrille chez les server, et ensuite seulement initialiser la grille chez le client?
Je ne pense pas,
Si j'ai bien compris, la [Command] est un ordre qu'on donne au serveur
Qui transmet le string à l'aide de la variable [SyncVar] à tous les players
le "hook" dans l'attribut [SyncVar] permet d'appeler une fonction qui s'exécute quand la variable change donc s'exécute chez tous les players,
C'est d'ailleurs ce qui se produit mais en mettant des print partout, j'ai remarqué que ça s'exécute plusieurs fois, notament la pression sur "Espace" alors que ça ne devrait s'exécuter qu'ne seule fois.
Et c'est ça qui me fout le bordel
La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

EmileF
Messages : 673
Inscription : 18 Mars 2017 19:39

Re: Probleme Synchronisation multiplayer

Message par EmileF » 03 Fév 2020 21:20

Bon, voilà après une recherche de plusieurs jours, (7 ou 8 jours)
je ne suis pas arrivé à comprendre comment créer une grille identique sur tous mes joueurs, avec UNET

Je me suis tourné vers Photon, PUN m'a permis d'arrivé au résultat escompté en moins de 2 jours.
Je conseille donc PUN, les tutos sont plus nombreux, plus clairs et la documentation sur le site plus à la portée d'un débutant.

Souvent j'ai l'impression qu'Unity ne s'adresse qu"aux professionnels et aux connaisseurs et du coup, sa documentation devient beaucoup trop technique pour un amateur.

Pour le cas ou ça intéresserai quelqu'un voilà la partie de script qui concerne ce détail:

Code : Tout sélectionner

    public TextMesh GrilleText;
    string grille;

    private void CreerGrille()
    {
        //creer la grille
        grille = "ABCDGJLOUTD";
        //mettre à jour l'affichage local
        GrilleText.text = grille;

        //transferer les données sur le reseau pour mettre à jour les autres instances
        object[] datas = new object[] { grille };
        PhotonNetwork.RaiseEvent(AFFICHE_GRILLE, datas, false, RaiseEventOptions.Default);
    }

    //pour ouvrir l'event 
    private void OnEnable()
    {
        PhotonNetwork.OnEventCall += EvendReceveid;
    }

    //pour fermer l'event
    private void OnDisable()
    {
        PhotonNetwork.OnEventCall -= EvendReceveid;
    }

    //pour mettre a jour et affiche la grille
    private void EvendReceveid(byte eventCode, object content, int senderId)
    {
        if (eventCode == AFFICHE_GRILLE)
        {
            object[] data = (object[])content;
            GrilleText.text = data[0].ToString();
        }
    }

La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

Avatar de l’utilisateur
Alesk
Messages : 2303
Inscription : 13 Mars 2012 09:09
Localisation : Bordeaux - France
Contact :

Re: [Resolu]Probleme Synchronisation multiplayer

Message par Alesk » 05 Fév 2020 12:15

Bravo !

Effectivement, ça semble bien plus simple :gene:

Répondre

Revenir vers « Scripting »