[RESOLU] Aide pour Déclarer une variable dans un prefab

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
UnityNoobUser
Messages : 5
Inscription : 21 Fév 2021 14:54

[RESOLU] Aide pour Déclarer une variable dans un prefab

Message par UnityNoobUser » 21 Fév 2021 16:13

Salut !

Comme beaucoup je viens de commencer à faire un petit jeux pour le plaisir d'apprendre et comme beaucoup je me casse les dents sur plein de petites choses dans le codage ^^. cela ne fait qu'une semaine donc soyez indulgent car je me doute que la réponse à ma question va être simple pour les "pros" ^^.
j'ai bien entendu essayé de chercher avant sur des tutos ou post sur des forums mais sur ce coup si je ne sais pas comment trouver ce que je cherche.

j'ai donc besoin de pouvoir déclarer un script de référence (mon Game_Script) dans le script rattaché a un préfab, Celui ci ayant besoin d’accéder à une variable de type array qui est contenue dans ce "Game_Script".
Dans le script attaché au préfab j'ai donc ajouté une variable public pour pouvoir renseigner ce script de référence:

Code : Tout sélectionner

//permet d’accéder au variables du script Game_Script.cs
public Game_Script GameScript;
mais comme c'est un préfab je ne peux a priori pas renseigner dans l'inspector le dit script et donc quand mon gameObject est "Instantiate" il n'a pas le nom du script et ne peut donc pas récupérer ma variable array.

je souhaite donc renseigner ce script de référence dans le void Start du script de mon préfab mais je n'y arrive pas :(

j'ai essayé des trucs de type:

Code : Tout sélectionner

//permet d'acceder au variables du script Game_Script.cs
static Game_Script GameScript = "Game_Script";
ou

Code : Tout sélectionner

    void Start()

    {
        if(GameScript == null)
        {
            GameScript = "Game_Script";
        }
qui donnent: "Impossible de convertir implicitement le type 'string' en 'Game_Script"

et si j’enlève les guillemets j'obtient un "Game_Script' est un type, qui n'est pas valide dans le contexte donné"

Pourriez me guider pour trouver une solution ?

merci d'avance a ceux qui prendront le temps de m'aiguiller et de partager leur connaissance ;)

UnityNoobUser
Messages : 5
Inscription : 21 Fév 2021 14:54

Re: Aide pour Déclarer une variable dans un prefab

Message par UnityNoobUser » 21 Fév 2021 20:16

bon ben je fais question réponse ^^

Code : Tout sélectionner

    void Awake()
    {
        if (game_Script == null)
        {
             game_Script = GameObject.FindGameObjectWithTag("GameScript").GetComponent<Game_Script>();
        }
    }

Avatar de l’utilisateur
Max
Messages : 8179
Inscription : 30 Juil 2011 13:57
Contact :

Re: [RESOLU] Aide pour Déclarer une variable dans un prefab

Message par Max » 21 Fév 2021 21:09

Bonsoir,

bon j'arrive après la bataille, mais c'est en effet une solution ;)
Sinon, un lien qui pourrait t'être utile, pour les bases en C#: https://openclassrooms.com/fr/courses/2 ... -c-sur-net
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

Avatar de l’utilisateur
eldoir
Messages : 8
Inscription : 25 Août 2016 16:54
Localisation : France
Contact :

Re: [RESOLU] Aide pour Déclarer une variable dans un prefab

Message par eldoir » 22 Fév 2021 17:37

Salut,
J'arrive aussi après mais j'espère que tu liras ce message ^^,
C'est plutôt une mauvaise pratique d'utiliser les tags et je vois deux raisons principales à ça :
- Pour des raisons de performance
- Pour des raisons de design du code
Pour le coup, vu que tu appelles ta fonction dans le Awake, en termes de perfs ce n'est pas bien méchant.

Par contre ce qui me fait poster ici c'est la 2e raison : ton code va être difficile à maintenir et débugger dans quelques temps.
- Si tu n'assignes pas le bon tag sur l'objet qui possède ton Game_Script : tu auras une erreur.
- Si ton objet taggé n'a pas le script sur lui : tu auras une erreur.
- Si tu renommes ou supprimes ton tag : tu auras une erreur.
On voit bien que les tags c'est vite coton à gérer.

En plus, vu le nom de ton script ("Game_Script"), je suppose que c'est un truc assez global qui doit gérer des trucs dans tout ton jeu. Je te suggérerais donc d'en faire un Singleton, c'est ce qu'on appelle un "Design Pattern".
Je te ramène à ce topic qui est plutôt pas mal (attention, en anglais) : https://gamedev.stackexchange.com/quest ... on-pattern
Ou sinon : https://wiki.unity3d.com/index.php/Singleton

Si tu transformes ton Game_Script en Singleton, alors tu auras accès à Game_Script depuis partout dans ton programme, et ce, sans avoir besoin de passer par les tags. Et tu n'auras plus besoin d'initialiser une variable game_Script pour chacun de tes scripts qui doit faire appel à des fonctionnalités de Game_Script. Tu pourras donc carrément enlever ton Awake.

Mettons que ton Game_Script gère le score, et que c'est pour ça que tu en avais besoin, alors au lieu de faire :

Code : Tout sélectionner

void Awake()
{
    if (game_Script == null)
    {
         game_Script = GameObject.FindGameObjectWithTag("GameScript").GetComponent<Game_Script>();
    }
}
    
void Update()
{
    if (condition)
        game_Script.AddPoints(50);
}
ton code deviendrait simplement :

Code : Tout sélectionner

void Update()
{
    if (condition)
        Game_Script.Instance.AddPoints(50);
}
Voilà, j'espère ne pas t'avoir perdu avec des "trucs de puriste". ^^
Les Singletons c'est vraiment utile, même si ce n'est pas la solution à tous les problèmes !

Répondre

Revenir vers « Scripting »