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

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
Avatar de l’utilisateur
Knight-HD
Messages : 7
Inscription : 14 Mai 2022 09:33

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

Message par Knight-HD » 14 Mai 2022 10:44

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();
        }
    }
    

Avatar de l’utilisateur
jmhoubre
Messages : 851
Inscription : 05 Oct 2019 22:05

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

Message par jmhoubre » 14 Mai 2022 15:43

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.

Avatar de l’utilisateur
Knight-HD
Messages : 7
Inscription : 14 Mai 2022 09:33

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

Message par Knight-HD » 14 Mai 2022 20:36

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.

Avatar de l’utilisateur
Knight-HD
Messages : 7
Inscription : 14 Mai 2022 09:33

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

Message par Knight-HD » 14 Mai 2022 21:16

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.
        }

Avatar de l’utilisateur
Knight-HD
Messages : 7
Inscription : 14 Mai 2022 09:33

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

Message par Knight-HD » 14 Mai 2022 22:06

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);
    }

Avatar de l’utilisateur
Max
Messages : 8763
Inscription : 30 Juil 2011 13:57
Contact :

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

Message par Max » 15 Mai 2022 10:39

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:
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

Avatar de l’utilisateur
Knight-HD
Messages : 7
Inscription : 14 Mai 2022 09:33

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

Message par Knight-HD » 16 Mai 2022 21:49

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.

Avatar de l’utilisateur
Knight-HD
Messages : 7
Inscription : 14 Mai 2022 09:33

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

Message par Knight-HD » 17 Mai 2022 19:23

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.

Répondre

Revenir vers « Scripting »