Page 1 sur 1

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

Publié : 13 Fév 2017 17:25
par balouu
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 =)

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

Publié : 13 Fév 2017 17:45
par boubouk50
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.

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

Publié : 15 Fév 2017 18:15
par balouu
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.").

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

Publié : 15 Fév 2017 21:49
par zebilamouche
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

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

Publié : 15 Fév 2017 22:12
par balouu
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.

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

Publié : 16 Fév 2017 00:51
par zebilamouche
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.

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

Publié : 16 Fév 2017 10:50
par boubouk50
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

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

Publié : 20 Fév 2017 20:05
par balouu
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:

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

Publié : 21 Fév 2017 10:18
par boubouk50
Yep, j'ai juste décomposé pour éclaircir les étapes de récupération.