IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Unity Discussion :

Pb Destroy et instantiate [Unity 5]


Sujet :

Unity

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 26
    Points : 19
    Points
    19
    Par défaut Pb Destroy et instantiate
    Salut tt le monde

    voici mon pb
    Je crée un objet qui correspond à un user qui se connecte, dans une fonction que j'ai créée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    usernamePrefab.GetComponentInChildren<Text>().text = c.clientName;
    GameObject go = (GameObject)Instantiate(usernamePrefab, connectedUserContainer.transform);
    Je voudrais que cet objet soit détruit quand il se deconnecte en passant par une fonction update dans une boucle qui correspond aux users deconnectés
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
            for (int i = 0; i < disconnectedList.Count; i++)
            {
                 //Debug.Log(disconnectedList[i].clientName + " s'est déconnecté !"+ clients);
     
                Broadcast(disconnectedList[i].clientName + " s'est déconnecté du serveur !", clients);
                //Debug.Log(disconnectedList[i].clientName + " s'est DECO !");
                Destroy(go);
                //disconnectedUser = disconnectedList[i].clientName;
     
                clients.Remove(disconnectedList[i]);
                disconnectedList.RemoveAt(i);
            };
    Sauf que evidemment, il n'en fait rien.
    Il doit me manquer un element de methodo plutot que du code mais je vois pas, etant donné que je suis pas un dev, mais plutot un noobdev
    Merci à ceux qui prendront le temps de me répondre

  2. #2
    Membre habitué Avatar de EliXirr
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 62
    Points : 176
    Points
    176
    Par défaut
    salut Kalinmba,

    Je n'ai pas forcément la solution, mais peut-être une piste à explorer.

    Essaies DestroyImmediate(). Je l'utilise certaines fois ou j'ai besoin de supprimer un GameObject sans qu'unity me casse les pieds. Par contre tu n'auras pas de fillet.

    Il faut savoir qu'avec Destroy() ton objet sera supprimé quand se sera le bon moment pour le moteur. Mais en gros si ton objet est utilisé (en référence) à plusieurs endroits, unity va être rétiscent à le supprimer afin d'eviter que ton objet soit égal à null.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 26
    Points : 19
    Points
    19
    Par défaut
    Merci pour la reponse mais j'ai deja essayé et ca ma tout cassé mon appli, vu que ca avait détruit mon prefab en fait.
    Mais j'ai peut etre une autre piste

  4. #4
    Membre habitué Avatar de EliXirr
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 62
    Points : 176
    Points
    176
    Par défaut
    mhh d'après ce que tu viens de me dire, j'ai un doute si t'as compris comment marchent les préfabs.

    t'es obligé de les instancier les préfabs.

    est-ce que t'as fait un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
          GameObject go = Instantiate(myprefab, new Vector3(0, 0, 0), Quaternion.identity);
          Destroy(Go);

  5. #5
    Membre éclairé

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Points : 877
    Points
    877
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par kalimmba Voir le message
    Sauf que evidemment, il n'en fait rien.
    Genre rien de rien, pas une erreur, warning, changement dans la scène ?

    Citation Envoyé par EliXirr Voir le message
    Essaies DestroyImmediate(). Je l'utilise certaines fois ou j'ai besoin de supprimer un GameObject sans qu'unity me casse les pieds. Par contre tu n'auras pas de fillet.
    C'est pas qu'il n'y a pas de filet, c'est que la destruction de l'objet est faite directement à l'appel de cette méthode, alors qu'elle est en fin de frame pour le Destroy.
    Du coup si ton objet continue à s’exécuter après ca, y'a LogError.
    Tu peux savoir si ton objet est détruit grâce a un (this != null).

    En gros, à part des cas très spécifiques, mieux vaut utiliser le Destroy, par contre en Editor (en dehors du mode Play), vu qu'il n'y a pas d'"Update", pas d'autres choix que de passer par le DestroyImmediate.

    Citation Envoyé par EliXirr Voir le message
    Il faut savoir qu'avec Destroy() ton objet sera supprimé quand se sera le bon moment pour le moteur. Mais en gros si ton objet est utilisé (en référence) à plusieurs endroits, unity va être rétiscent à le supprimer afin d'eviter que ton objet soit égal à null.
    Je serais curieux de voir ça.

  6. #6
    Membre habitué Avatar de EliXirr
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 62
    Points : 176
    Points
    176
    Par défaut
    J'ai parfois eu le sentiment que cela fonctionnait ainsi dans certains algos. Après un ptit tour dans la documentation, effectivement PilloBuenaGente j'ai dit une petite connerie t'as raison.

    Comme quoi ça vaut le coup de trainer sur dvpr.net ^^

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 26
    Points : 19
    Points
    19
    Par défaut
    En fait j'ai trouvé où ca clochait, le 'destroy' était sur le prefab et pas sur le gameobject que j'instantiais.
    Bref, mauvaise compréhension de la fonction de ma part.

    bon maintenant j'ai un autre probleme, qui est plus de la methodo de dev
    voila le probleme
    J'ai 2 listes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        public List<ServerClient> clients;
        private List<ServerClient> disconnectedList;
    avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class ServerClient
    {
        public TcpClient tcp;
        public string clientName;
     
        public ServerClient(TcpClient clientSocket)
        {
            clientName = "Invité";
            tcp = clientSocket;
        }
     
    }
    Ce que je veux c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
                        // Si liste clients contient cl.clientName alors on instancie usernamePrefab correspondant
                        if (clients.Contains(cl.clientName))
                        {
                            GameObject go = (GameObject)Instantiate(usernamePrefab, connectedUserContainer.transform);
                        }
     
                        // Si liste disconnectedList contient cl.clientName alors on destroy usernamePrefab correspondant}
    Or quand je fais ça, j'ai le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Argument `#1' cannot convert `string' expression to type `ServerClient'
    Et là, je sais pas quoi faire.
    J'essaie bien avec la methode Convert.ToString, mais ça passe pas. Je me dis aussi c'est peut etre dans la class ServerClient mais je sais pas quoi ajouter

    Quelqu'un aurait une idée ?

  8. #8
    Membre éclairé

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Points : 877
    Points
    877
    Billets dans le blog
    1
    Par défaut
    Le plus simple je pense:
    - Une boucle for qui contiendra un if(clients[index].clientName == cl.clientName).
    - La libraire System.Linq qui permet de faire if(clients.Any(c => c.clientName == cl.clientName) (lib pas toujours compatible sur toutes les plateformes)

    C'est pas un peut du lancé de dés ?

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 26
    Points : 19
    Points
    19
    Par défaut
    Citation Envoyé par PilloBuenaGente Voir le message
    C'est pas un peut du lancé de dés ?
    C'est à dire ?

  10. #10
    Membre éclairé

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Points : 877
    Points
    877
    Billets dans le blog
    1
    Par défaut
    J'ai l'impression, peut être à tort, que les bases ne sont pas digérée et que les choses sont faites de manière hasardeuses.

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 26
    Points : 19
    Points
    19
    Par défaut
    Citation Envoyé par PilloBuenaGente Voir le message
    J'ai l'impression, peut être à tort, que les bases ne sont pas digérée et que les choses sont faites de manière hasardeuses.
    C'est vrai que la digestion est longuette...
    J'avance effectivement à tatons dans le noir

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 26
    Points : 19
    Points
    19
    Par défaut
    Bon pour ceux qui suivent sans interet cette discussion, j'ai trouvé un moyen de destroy mes users.
    il suffisait de donner un nom a l'objet que j'instancie, puis de le chercher et de le destroy
    ouais c'etait tout bete en fait, il suffisait de savoir qu'on peut les nommer ces gameobjects !
    Merci à ceux qui ont essayé de m'aider

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [generics] instantier un objet
    Par Bobo59 dans le forum Langage
    Réponses: 1
    Dernier message: 04/11/2005, 09h47
  2. [DLL] Release et Destroy
    Par Pedro dans le forum Langage
    Réponses: 7
    Dernier message: 08/09/2005, 15h35
  3. Réponses: 2
    Dernier message: 02/08/2005, 11h44
  4. [Plugin] Comment instantier certaines classes de ANT ?
    Par relivio dans le forum Eclipse Platform
    Réponses: 2
    Dernier message: 01/04/2004, 15h45
  5. DESTROY a table!!
    Par kabol dans le forum Langage SQL
    Réponses: 2
    Dernier message: 16/02/2004, 22h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo