Page 1 sur 1

[DB-RS] apparition d'un objet client avec Mirror.

Publié : 14 Mai 2022 10:44
par Knight-HD
Bonjour à tous,
je dev sur Unity depuis 2 semaine et j'ai commencé avec le tuto de tower-deffense présent sur la chaîne youtube Tuto Unity FR.
je m'amuse à modifier un peux le code afin de me familiariser avec Unity et C#, j'ai également décidé d'essayer d'intégrer un multijoueur avec l'aide de l'asset Mirror et je rencontre un problème pour lequel je ne trouve pas de réponse m'aidant à régler mon souci.

j'ai réussi à syncro les vagues du serveur vers le client, j'arrive également à faire en sorte que les tourelles invoqué par l'hôte apparaissent sur le client et inversement.
mon souci c'est que quand le client fait apparaitre une tourelle il fait apparaitre celles sélectionné par le serveur et prend également l'argent sur le server.

je suis débutant et je ne souhaite pas spécialement que l'ont code à ma place, mon but est d'apprendre alors si quelqu'un peux m'envoyer dans la bonne direction et m'aider à comprendre comment faire je lui serais grandement reconnaissant.

Code : Tout sélectionner

   
   private void BuildTurret(TurretBlueprint blueprint)
    {
        if (PlayerStats.money < blueprint.cost)
        {
            //Debug.Log("Tu n'as pas d'argent" + PlayerStats.money);
            return;
        }

        PlayerStats.money -= blueprint.cost;

        turretBlueprint = blueprint;

        GameObject _turret = (GameObject)Instantiate(blueprint.prefab, GetBuildPosition(), Quaternion.identity);
        NetworkServer.Spawn(_turret);
        turret = _turret;

        GameObject effect = (GameObject)Instantiate(buildManager.buildEffect, GetBuildPosition(), Quaternion.identity);
        Destroy(effect, 1f);
    }

    
    [Command(requiresAuthority = false)]
    public void CmdBuildIt()
    {
        BuildTurret(buildManager.GetTurretToBuild());
    }

private void OnMouseDown()
    {
        if (isServer)
        {
            BuildTurret(buildManager.GetTurretToBuild());
        }
        else
        {
            CmdBuildIt();
        }
    }
    

Re: [DB-RS] apparition d'un objet client avec Mirror.

Publié : 14 Mai 2022 15:43
par jmhoubre
Bonjour,

conseils :
  • ne pas avoir les yeux plus gros que le ventre. Coder est un exercice d'humilité avant tout.
  • s'attaquer à des choses simples. Je ne pense pas que le multijoueur fasse partie de cette catégorie.
  • visionner des tutos pour apprendre à coder. La chaîne Tuto Unity Fr propose une playlist : l'as-tu parcourue ?
  • ce sujet du forum propose des ressources pour débutants.
  • n'hésite-pas à te présenter sur le sujet ad hoc : si tu as 15 ans de développement derrière toi, ce n'est pas la même chose que d'être un parfait débutant.
Pour répondre à ton problème, as-tu parcouru la doc de Mirror ? Tuto Unity Fr propose également une série sur le développement d'un FPS avec Mirror.

Re: [DB-RS] apparition d'un objet client avec Mirror.

Publié : 14 Mai 2022 20:36
par Knight-HD
Merci pour ta réponse,

Oui j'ai visionné les vidéo de Tuto Unity Fr c'est d'ailleur sur la base d'un de ces tuto que j'ai fait le tower deffense.
j'ai également suivi le tuto sur mirror mais je n'ai malheureusement pas trouvé de réponse à mon problème.

j'ai parcourue la doc Mirror et cherche depuis 3 jours des réponses sur google en vain.

Re: [DB-RS] apparition d'un objet client avec Mirror.

Publié : 14 Mai 2022 21:16
par Knight-HD
J'essaye de fair autrement mais au moment ou le client appel la commande pour lancer la construction de la tourelle j'ai cette erreur
Image

Code : Tout sélectionner

if (isServer)
        {
            BuildTurret(buildManager.GetTurretToBuild());
        }
        else
        {
            CmdBuildIt(buildManager.GetTurretToBuild()); // Fonction qui crée l'érreur.
        }

Re: [DB-RS] apparition d'un objet client avec Mirror.

Publié : 14 Mai 2022 22:06
par Knight-HD
J'ai de nouveaux essayé de faire autrement mais je vous avoue que je ne comprend pas pourquoi j'obtiens cette erreur:
Image

Code : Tout sélectionner

CmdBuildIt(buildManager.GetTurretToBuild()); //Fonction appelé par le client

[Client]
    public void CmdBuildIt(TurretBlueprint blueprint)
    {

        if (PlayerStats.money < blueprint.cost)
        {
            //Debug.Log("Tu n'as pas d'argent" + PlayerStats.money);
            return;
        }

        PlayerStats.money -= blueprint.cost;

        turretBlueprint = blueprint;

        GameObject _turret = (GameObject)Instantiate(blueprint.prefab, GetBuildPosition(), Quaternion.identity); //tentative pour fix l'erreur
        NetworkServer.Spawn(_turret);
        BuildTurretClient(_turret); //commande qui créer l'érreur
    }
    
    [Command(requiresAuthority = false)]
    private void BuildTurretClient(GameObject _turret)
    {
        Debug.Log("je dois spawn la");
        NetworkServer.Spawn(_turret);
    }

Re: [DB-RS] apparition d'un objet client avec Mirror.

Publié : 15 Mai 2022 10:39
par Max
Bonjour,

c'est un warning plutôt qu'une erreur, ou tu sembles chercher à synchroniser un GameObject qui n'est pas initialisé/positionné dans ta scène.
Après perso, je n'ai aucune compétence pour tout ce qui touche à la partie réseau :mrgreen:

Re: [DB-RS] apparition d'un objet client avec Mirror.

Publié : 16 Mai 2022 21:49
par Knight-HD
vous allez peut être pouvoir m'aider plus facilement si je vous dit ce que je souhaite faire directement.

J'ai un UI avec plusieurs tourelle (Prefab) disponible qui est le même sur chaque client (le shop).

Le terrain est composé de plusieurs nodes utilisé pour poser les tourelles.

Le joueur (client/owner) selectionne une tourelle dans le shop et va ensuite cliquer sur la node pour faire apparaitre la tourelle selectionné dessus.

ma question est comment je peux envoyé au server l'information client qui correspond à la tourelle(prefab) ainsi que la node selectionner afin que le server la spawn sur tous les clients.

Re: [DB-RS] apparition d'un objet client avec Mirror.

Publié : 17 Mai 2022 19:23
par Knight-HD
Si jamais quelqu'un passe par là avec le même souci que moi voici une solution qui fonctionne.

J'ai commencé par instancier toutes les tourrelles dans le script que le client utilise pour faire la demande de spawn au serveur.

Code : Tout sélectionner

public GameObject[] turretBuildIt;
mon client fait ça part du travail avant d'envoyer la demande au serveur dans laquel j'ai ajouté un nom pour chaques tourrelles afin de faire un comparaison.

Code : Tout sélectionner

[Client]
    public void BuildIt(TurretBlueprint blueprint)
    {

        if (PlayerStats.money < blueprint.cost)
        {
            return;
        }

        PlayerStats.money -= blueprint.cost;

        turretBlueprint = blueprint;
        Position = GetBuildPosition();

        //GameObject _turret = (GameObject)Instantiate(blueprint.prefab, GetBuildPosition(), Quaternion.identity);

        //Debug.Log("Voici se que client envoie" + " " + _turret + "position" + " " + Quaternion.identity + " " + blueprint.name + " " + "et" + " ");

        turretname = blueprint.name;

       CmdBuildTurret(turretname, Position);
    }
puis pour finir voici la command serveur

Code : Tout sélectionner

    [Command(requiresAuthority = false)]
    private void CmdBuildTurret(string turretname, Vector3 Position)
    {
        //turret = _turret;
        Debug.Log("je dois spawn la" + " " + turretname + " " + " à " + " " + Position + " " + "position");

        TurretBlueprint blueprint = (buildManager.GetTurretToBuild());

        if(turretname == "standarturret")
        {
            GameObject _turret = (GameObject)Instantiate(turretBuildIt[0], Position, Quaternion.identity);
            NetworkServer.Spawn(_turret);
            Debug.Log("la standar");
        }
        else if(turretname == "missilelauncher")
        {
            GameObject _turret = (GameObject)Instantiate(turretBuildIt[2], Position, Quaternion.identity);
            NetworkServer.Spawn(_turret);
            Debug.Log("la missile");
        }
        else if(turretname == "turretlaser")
        {
            GameObject _turret = (GameObject)Instantiate(turretBuildIt[6], Position, Quaternion.identity);
            NetworkServer.Spawn(_turret);            
        }
        else if(turretname == "turretexplo")
        {
            GameObject _turret = (GameObject)Instantiate(turretBuildIt[4], Position, Quaternion.identity);
            NetworkServer.Spawn(_turret);             
        }
        else if(turretname == "turretsnip")
        {
            GameObject _turret = (GameObject)Instantiate(turretBuildIt[8], Position, Quaternion.identity);
            NetworkServer.Spawn(_turret);             
        }
    }
Alors c'est surrement loin d'être la meilleure solution mais ça fonctionne.