[RÉSOLU][DB-AL] Récupérer le script d'un objet instancié

Pour les scripts écrits en C#
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
balouu
Messages : 14
Inscription : 13 Fév 2017 17:12

[RÉSOLU][DB-AL] Récupérer le script d'un objet instancié

Message par balouu » 13 Fév 2017 17:25

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 =)
Dernière édition par balouu le 20 Fév 2017 21:17, édité 1 fois.

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6220
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [DB-AL] Récupérer le script d'un objet instancié

Message par boubouk50 » 13 Fév 2017 17:45

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

balouu
Messages : 14
Inscription : 13 Fév 2017 17:12

Re: [DB-AL] Récupérer le script d'un objet instancié

Message par balouu » 15 Fév 2017 18:15

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:

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
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.").

zebilamouche
Messages : 38
Inscription : 17 Juin 2016 20:34

Re: [DB-AL] Récupérer le script d'un objet instancié

Message par zebilamouche » 15 Fév 2017 21:49

Salut, dans ton cas le plus simple sera :

Code : Tout sélectionner

ScriptA
ScriptB objetInstancie = (ScriptB)Instantiate(GameObjectEnReference).GetComponent<ScriptB>(); 
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 :

Code : Tout sélectionner

ScriptA
ScriptB objetInstancie = Instantiate(GameObjectEnReference).GetComponent<ScriptB>() as ScriptB; 
Edit : Oublie du GetComponent
Dernière édition par zebilamouche le 16 Fév 2017 00:54, édité 4 fois.

balouu
Messages : 14
Inscription : 13 Fév 2017 17:12

Re: [DB-AL] Récupérer le script d'un objet instancié

Message par balouu » 15 Fév 2017 22:12

Bonsoir et merci de la réponse :)
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.
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.

Code : Tout sélectionner

ScriptB objetInstancie = Instantiate(GameObjectEnReference) as ScriptB;  // Fonctionne et la boucle me crée mon terrain, tout roule
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.

zebilamouche
Messages : 38
Inscription : 17 Juin 2016 20:34

Re: [DB-AL] Récupérer le script d'un objet instancié

Message par zebilamouche » 16 Fév 2017 00:51

Autant pour moi, j'ai oublié quelque chose :

Code : Tout sélectionner

ScriptB objetInstancie = (ScriptB)Instantiate(GameObjectEnReference).GetComponent<ScriptB>(); 
Tu dois mettre un 'GetComponent' afin de dire ou se trouve le fameux scriptB.

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6220
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [DB-AL] Récupérer le script d'un objet instancié

Message par boubouk50 » 16 Fév 2017 10:50

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

balouu
Messages : 14
Inscription : 13 Fév 2017 17:12

Re: [DB-AL] Récupérer le script d'un objet instancié

Message par balouu » 20 Fév 2017 20:05

Merci pour ces réponses, j'essaie ça en arrivant chez moi, je vous tiens au courant!
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
et ça:

Code : Tout sélectionner

ScriptB objetInstancie = (ScriptB)Instantiate(GameObjectEnReference).GetComponent<ScriptB>();
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 :faché: :super:

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6220
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é

Message par boubouk50 » 21 Fév 2017 10:18

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

Répondre

Revenir vers « (C#) CSharp »