Accéder au script enfant depuis le script parent

Questions techniques liées à l’utilisation d'Unity (et n'entrant pas dans le cadre d'une des sections suivantes)
Epsi
Messages : 3
Inscription : 03 Fév 2023 18:19

Accéder au script enfant depuis le script parent

Message par Epsi » 04 Fév 2023 10:38

Bonjour,

Savez-vous s'il existe un moyen "Générique" d'accéder au script de l'enfant d'un gameObject sans indiquer son type ?
Existe-t-il une variable générique dans laquelle je pourrais stocker le script en question ?
(pouvoir y mettre des scripts différents selon les cas et y accéder avec la même ligne de code pendant le jeu)

J'explique globalement là où je bloque :
Je cherche à créer un système d'items
Au début j'ai créé des SciptableObjects (Item) ainsi qu'une classe <Item> dans laquelle je renseigne le ScriptableObject désiré et que je met sur des préfabs

Au start, la classe item récupère les infos du ScriptableObject, notamment :
Nom : -
Modèle 3D : -
Modèle 2D : -

J'ai mis au point un système d'inventaire avec un dictionnaire dans lequel je range directement ces préfabs
Ce dictionnaire prend comme index le nom du slot, et contient le préfab (GameObject)
Je vais ensuite chercher les infos en faisant :
dictionnaire[nom du slot].GetComponent<Item>().nom si je veux récupérer le nom par exemple
Seulement maintenant que j'ai un peu avancé, il me faut ajouter des caractéristiques à mes items, et je ne vais pas ajouter un niveau d'amélioration à des Pierres ou de Rondins de bois

Afin de résoudre ce problème, j'ai fait un système d'héritage, d'une classe Equipement et une classe Ressource, qui ajouteraient des infos supplémentaires à mon item.

Le problème, vous avez du le deviner, c'est que je peux plus y accéder en faisant GetComponent<Item>, mais je dois ensuite récupérer le script de l'Equipement.
Les 2 options que j'ai trouvé sont :
1- Déclarer un script de type Equipement
Ça pose problème car je vais pas déclarer tous les héritages possibles dans la classe mère
2- Le mettre sur mon gameObject et aller le chercher avec une condition Si "Equipement" alors GetComponent<Equipement>()
Mais demain si j'ai 50 armes différentes ça sera plus possible

Voilà j'espère avoir été suffisamment clair, je vous remercie d'avancer pour l'aide que vous pourrez m'apporter
Bonne journée à vous

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

Re: Accéder au script enfant depuis le script parent

Message par jmhoubre » 04 Fév 2023 12:14

Alors, en lisant seulement tes premières lignes, je dirai :

Code : Tout sélectionner

MonoBehaviour[] mono = FindObjectsOfType<MonoBehaviour> ();
Cette instruction va te donner l'ensemble des objets, enfant ou non, portant un script dérivant de MonoBehaviour.

Mais en lisant le reste, je doute que cette réponse t'aide. Mais je retrouve un problème que j'ai eu et que j'ai résolu en faisant des ScriptableObject qui dérivaient d'une classe mère, ce qui permettaient d'avoir des items Ressource, avec nom, poids, prix, visuels, et des items Weapon avec les mêmes caractéristiques plus attaque, défense, damage, etc...

Epsi
Messages : 3
Inscription : 03 Fév 2023 18:19

Re: Accéder au script enfant depuis le script parent

Message par Epsi » 05 Fév 2023 13:42

Bonjour et merci pour ta réponse

Effectivement, FindObjectsOfType aurait été une bonne solution si il fonctionnait à l'envers, en fait il me faut accéder au script qui est sur l'objet, et non à l'objet qui contient le script ^^

Pour les scriptableobjects, tu veux dire que tu avais fait quelque chose du genre

Item : ScriptableObject
Equipment : Item

C'est vrai que j'avais pas pensé à ça, je vais essayer je te tiens au courant !

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

Re: Accéder au script enfant depuis le script parent

Message par jmhoubre » 05 Fév 2023 18:30

Je ne comprends pas pourquoi tu veux accéder au script. Tu pourrais poster le code complet ?

Epsi
Messages : 3
Inscription : 03 Fév 2023 18:19

Re: Accéder au script enfant depuis le script parent

Message par Epsi » 05 Fév 2023 19:10

Bon, ça marche!

J'ai créé des héritages de ScritableObjects, avec un type à chaque "étage"
Et j'ai ensuite fait des scripts qui regardent le type de chaque étage ajoutent des composants en fonction
Comme ça je renseigne le dernier enfant de mon ScriptableObject en modèle, et mon objet se crée tout seul avec les différents étages (Item, Equipement, Arme, Dague par exemple)
Ensuite je peux accéder à un variable stockée dans Dague en castant Item comme une Dague par exemple

Donc c'est parfait, merci beaucoup pour ton idée

Répondre

Revenir vers « Unity le logiciel »