[RÉSOLU][DB-AL] Récupérer le script d'un objet instancié
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
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
[RÉSOLU][DB-AL] Récupérer le script d'un objet instancié
Bonjour à tous, j'ai une question dont la réponse doit être assez simple je pense mais je trouve pas parce que je suis pas bien doué.
Donc voilà, j'ai un script A qui crée un nombre prédéfini d'objets. Ces objets sont des cubes préfabriqués sur lesquels j'ai posé un script B.
Le truc, c'est que j'aimerais avoir accès aux variables de ce script B pour différencier les différents objets créés par ma fonction dans le script A.
Pour plus de précision, ces cubes sont créés afin de représenter une "case" d'un terrain. Dans le script B qui leur est relié j'ai donc une position x et une position y (qui est en fait une position z si on est pointilleux) et également la liste des cases adjacentes.
Je vois deux approches: ou bien je peux réussir à modifier les variables du script B dans script A , ou bien je crée dans script A un objet de type "case" que j'accroche ensuite à l'objet instantié (et donc les valeurs dans script B de cet objet seront celles décidées dans script A) mais je ne sais pas si la seconde solution est possible.
Si quelqu'un peut m'aider, ça serait très sympa merci bien =)
Donc voilà, j'ai un script A qui crée un nombre prédéfini d'objets. Ces objets sont des cubes préfabriqués sur lesquels j'ai posé un script B.
Le truc, c'est que j'aimerais avoir accès aux variables de ce script B pour différencier les différents objets créés par ma fonction dans le script A.
Pour plus de précision, ces cubes sont créés afin de représenter une "case" d'un terrain. Dans le script B qui leur est relié j'ai donc une position x et une position y (qui est en fait une position z si on est pointilleux) et également la liste des cases adjacentes.
Je vois deux approches: ou bien je peux réussir à modifier les variables du script B dans script A , ou bien je crée dans script A un objet de type "case" que j'accroche ensuite à l'objet instantié (et donc les valeurs dans script B de cet objet seront celles décidées dans script A) mais je ne sais pas si la seconde solution est possible.
Si quelqu'un peut m'aider, ça serait très sympa merci bien =)
Dernière édition par balouu le 20 Fév 2017 21:17, édité 1 fois.
- boubouk50
- ModoGenereux
- Messages : 6243
- Inscription : 28 Avr 2014 11:57
- Localisation : Saint-Didier-en-Bresse (71)
Re: [DB-AL] Récupérer le script d'un objet instancié
Salut Balouu,
Si tu instancies un objet alors, au moment de sa création tu as accès à cet objet. Tu as donc accès à ses scripts que tu peux lier, stocker, affecter, etc.
Vu que c'est ton script A qui gère les objets qui possèdent le script B, tu peux faire ce que tu veux pour récupérer ce que tu veux du script B.
Ensuite, c'est une question de scope (portée des variables). Les variables privées ne seront pas accessibles, il faut qu'elles soient publiques.
Aussi, en tant que nouveau membre, merci de te présenter dans la section Présentation des membres.
Si tu instancies un objet alors, au moment de sa création tu as accès à cet objet. Tu as donc accès à ses scripts que tu peux lier, stocker, affecter, etc.
Vu que c'est ton script A qui gère les objets qui possèdent le script B, tu peux faire ce que tu veux pour récupérer ce que tu veux du script B.
Ensuite, c'est une question de scope (portée des variables). Les variables privées ne seront pas accessibles, il faut qu'elles soient publiques.
Aussi, en tant que nouveau membre, merci de te présenter dans la section Présentation des membres.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation
Re: [DB-AL] Récupérer le script d'un objet instancié
Oui, les variables de scriptB que j'ai besoin de récupérer dans scriptA sont publiques.
Mais, comment faire?
Je veux dire, j'ai accroché dans l'éditeur l'objet à instancier, qui contient donc scriptB, mais rien à faire l'autocomplétion n'est pas d'accord avec moi.
et je vais me présenter de ce pas du coup
EDIT:
si à la suite de mon code je tape "objetInstancie.VariableX" on me renvoie qu'il y a rien dans objetInstancie qui s'appelle comme ça. Alors que le script est attaché à l'objet auquel correspond maintenant cette variable objetInstancie
EDIT BIS:
Dans le script A, j'ai remplacé le type de la variable "objetInstancie" par le type ScriptB. Ça marche pas forcément mieux mais c'est plus logique. Mais est-ce qu'on peut faire un cast de GameObject vers une classe créée?
-> Du coup, j'ai accès aux variables dans le script et c'est très bien, sauf que maintenant c'est dans l'éditeur que ça foire parce que mon cast ne fonctionne pas ("InvalidCastException: Cannot cast from source type to destination type.").
Mais, comment faire?
Je veux dire, j'ai accroché dans l'éditeur l'objet à instancier, qui contient donc scriptB, mais rien à faire l'autocomplétion n'est pas d'accord avec moi.
et je vais me présenter de ce pas du coup
EDIT:
Code : Tout sélectionner
ScriptB
public int VariableX;
public int VariableY;
Code : Tout sélectionner
ScriptA
GameObject objetInstancie = Instantiate(GameObjetEnReference); // GameObjetEnReference: les "cases" du terrain, on a accroché le prefab dessus dans l'éditeur
EDIT BIS:
Dans le script A, j'ai remplacé le type de la variable "objetInstancie" par le type ScriptB. Ça marche pas forcément mieux mais c'est plus logique. Mais est-ce qu'on peut faire un cast de GameObject vers une classe créée?
-> Du coup, j'ai accès aux variables dans le script et c'est très bien, sauf que maintenant c'est dans l'éditeur que ça foire parce que mon cast ne fonctionne pas ("InvalidCastException: Cannot cast from source type to destination type.").
-
- Messages : 38
- Inscription : 17 Juin 2016 20:34
Re: [DB-AL] Récupérer le script d'un objet instancié
Salut, dans ton cas le plus simple sera :
Tu declares ta variabe objetInstancie entant que ScriptB (Script qui est sur GameObjectEnReference), et tu instancies en "castant" la fonction 'Instantiate' en ScriptB ('Instantiate' est déclaré comme un GameObject de base). Et enfin, tu précises où chercher le 'ScriptB'- en l'occurrence sur 'GameObjectReference' - grâce au GetComponent.
Ca marche aussi comme ça :
Edit : Oublie du GetComponent
Code : Tout sélectionner
ScriptA
ScriptB objetInstancie = (ScriptB)Instantiate(GameObjectEnReference).GetComponent<ScriptB>();
Ca marche aussi comme ça :
Code : Tout sélectionner
ScriptA
ScriptB objetInstancie = Instantiate(GameObjectEnReference).GetComponent<ScriptB>() as ScriptB;
Dernière édition par zebilamouche le 16 Fév 2017 00:54, édité 4 fois.
Re: [DB-AL] Récupérer le script d'un objet instancié
Bonsoir et merci de la réponse
Oui j'ai essayé de le caster, selon les méthodes:
Avec la méthode "as" (que je ne connaissais pas, merci beaucoup!) là miracle, ça marche!
SAUF s'il me prend l'envie par la suite de modifier une des variables contenues dans le scriptB. Ce qui est mon objectif.
Mais si je fais objetInstancie.VariableX = x; dans ma boucle de création des cases, dans le script tout roule mais au moment de lancer dans l'éditeur j'ai: "NullReferenceException: Object reference not set to an instance of an object"
Ce qui est faux, j'ai mon objet qui est en référence, il y est j'en suis sûr.
Oui j'ai essayé de le caster, selon les méthodes:
Code : Tout sélectionner
ScriptB objetInstancie = (ScriptB)Instantiate(GameObjectEnReference);
// Réponse de l'éditeur: InvalidCastException: Cannot cast from source type to destination type.
SAUF s'il me prend l'envie par la suite de modifier une des variables contenues dans le scriptB. Ce qui est mon objectif.
Code : Tout sélectionner
ScriptB objetInstancie = Instantiate(GameObjectEnReference) as ScriptB; // Fonctionne et la boucle me crée mon terrain, tout roule
Ce qui est faux, j'ai mon objet qui est en référence, il y est j'en suis sûr.
-
- Messages : 38
- Inscription : 17 Juin 2016 20:34
Re: [DB-AL] Récupérer le script d'un objet instancié
Autant pour moi, j'ai oublié quelque chose :
Tu dois mettre un 'GetComponent' afin de dire ou se trouve le fameux scriptB.
Code : Tout sélectionner
ScriptB objetInstancie = (ScriptB)Instantiate(GameObjectEnReference).GetComponent<ScriptB>();
- boubouk50
- ModoGenereux
- Messages : 6243
- Inscription : 28 Avr 2014 11:57
- Localisation : Saint-Didier-en-Bresse (71)
Re: [DB-AL] Récupérer le script d'un objet instancié
Tu peux également découper en plusieurs morceaux:
Code : Tout sélectionner
GameObject objetInstancie = Instantiate(GameObjetEnReference); //Récupérer le GameObject
ScriptB scriptB = objetInstancie.GetComponent <ScriptB> (); //Récupérer son script, donc son Component ScriptB
int varX = scriptB.VariableX; //Récupérer VariableX. Par contre par convention, les variables commencent par une minuscule, tu devrais la nommer variableX
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation
Re: [DB-AL] Récupérer le script d'un objet instancié
Merci pour ces réponses, j'essaie ça en arrivant chez moi, je vous tiens au courant!
Mais du coup, ça:
et ça:
c'est la même chose? D'après ce que j'en comprend, c'est bien la même chose avec juste dans la longue on y va par étapes et on crée des variables pour tout stocker sur son chemin (là où dans la courte on accroche juste le scriptB sur l'objet instancié car les nouvelles instances n'ont pas automatiquement les components qu'on a attachés sur les prefabs?)
EDIT: C'est bon ça a marché merci beaucoup! Du coup je dois récupérer le script avec un GetComponent<>(), parfait
Mais du coup, ça:
Code : Tout sélectionner
GameObject objetInstancie = Instantiate(GameObjetEnReference); //Récupérer le GameObject
ScriptB scriptB = objetInstancie.GetComponent <ScriptB> (); //Récupérer son script, donc son Component ScriptB
int varX = scriptB.VariableX; //Récupérer VariableX. Par contre par convention, les variables commencent par une minuscule, tu devrais la nommer variableX
Code : Tout sélectionner
ScriptB objetInstancie = (ScriptB)Instantiate(GameObjectEnReference).GetComponent<ScriptB>();
EDIT: C'est bon ça a marché merci beaucoup! Du coup je dois récupérer le script avec un GetComponent<>(), parfait
- boubouk50
- ModoGenereux
- Messages : 6243
- Inscription : 28 Avr 2014 11:57
- Localisation : Saint-Didier-en-Bresse (71)
Re: [RÉSOLU][DB-AL] Récupérer le script d'un objet instancié
Yep, j'ai juste décomposé pour éclaircir les étapes de récupération.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation