[DB-AL] Modifier un GameObject avant de l'instancier

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
Monsieur_Jack
Messages : 12
Inscription : 16 Fév 2017 23:20

[DB-AL] Modifier un GameObject avant de l'instancier

Message par Monsieur_Jack » 08 Fév 2018 23:33

Bonjour tout le monde !
Je rencontre actuellement un problème qui ne doit pas être compliqué (d'ailleurs j'ai déjà trouvé une solution mais sale...)
Alors voilà le problème, je souhaite créer un GameObject et le modifier puis l'instancier sauf que je n'y arrive pas car la modification se passe bien mais avec le Start() de l'instanciation... Les modifs sont reset !
De plus, je ne peux pas modifier le Renderer sans que l'objet soit crée.

Voici la classe qui génère tout ça pour mieux comprendre :

Code : Tout sélectionner

public class EggGenerator : MonoBehaviour
{

    private EggConfig config;
    public GameObject eggPrefab;

    void Start()
    {
        config = GameObject.Find("Sun").GetComponent<EggConfig>();
    }

    public void GiveEgg(Queenbehaviour queen, int prob = -1)
    {

        Egg egg = eggPrefab.GetComponent<Egg>();

        //Generate type and attribut
        float minus = this.GenerateEgg(egg, prob);

        if (minus != -1)
        {
            if (queen.curEnergy >= minus)
            {
                queen.curEnergy -= minus;
                Instantiate(eggPrefab, queen.spawner.transform.position, Quaternion.identity);
            }
        }

    }

    public float GenerateEgg(Egg egg, int prob)
    {

        float costEgg = 0;

        //If no buff for probabilities
        if (prob == -1)
        {
            costEgg = this.LegitGenerete(egg);
        }
        else
        {
            costEgg = this.BoostGenerete(egg, prob);
        }

        return costEgg;

    }

    public float RandomGenerator()
    {
        return Random.Range(0f, config.GetMaxProba() + config.GetFailproba());
    }

    private float LegitGenerete(Egg egg)
    {
        float rateSpawn = this.RandomGenerator();

        foreach (EggState state in this.GetListProba())
        {
            if (rateSpawn >= state.min && rateSpawn <= state.max)
            {
                return this.InitEgg(egg, state.indTypeScrum);
            }
        }

        return -1;
    }

    private float BoostGenerete(Egg egg, int typeOfScrumBoost)
    {
        float rateSpawn = this.RandomGenerator();

        //One chance for 4 to create the needed egg
        if (rateSpawn >= config.GetBoostBegin() && rateSpawn <= config.GetBoostEnd())
        {
            return this.InitEgg(egg, typeOfScrumBoost);
        }
        else
        {
            return this.LegitGenerete(egg);
        }

    }

    private float InitEgg(Egg egg, int index)
    {
        egg.energieToEvolve = this.config.GetCost(index);
        egg.iAmThis = this.config.GetScrumType(index);
        //egg.rend.material.color = this.config.GetColor(index);
        return this.config.GetCostEgg(index);
    }

    private EggState[] GetListProba()
    {
        EggState[] list = new EggState[EggConfig.sizeOfTypeScrum];
        float max, min = 0;
        float limit = config.GetMaxProba();
        int total = 0, i = 0;

        //Calcul of total
        foreach (int proba in config.scrumProba.Values)
        {
            total += proba;
        }

        //Calcul of proba by type of scrum
        foreach (KeyValuePair<int, int> entry in config.scrumProba)
        {
            max = (entry.Value * limit) / total;
            list[i] = new EggState(entry.Key, min, max);
            min = max + 1;
            i++;
        }

        return list;
    }

}
eggPrefab est prérempli dans Unity et c'est lui que je veux modifier.
Vous pouvez voir que je ne l'instancie que à la fin cependant... Le start() détruit tout...

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

Re: [DB-AL] Modifier un GameObject avant de l'instancier

Message par boubouk50 » 09 Fév 2018 10:18

Pas trop compris.
Qu'est ce qui se remet à zéro? Les components attachés? Un script dessus les réinitialise?
Avec Instantiate (), tu clones à l'identique un objet. Ce peut-être un prefab, un gameObject et même un Component. Normalement, tu obtiens une copie conforme. Si un Start () d'un script vient modifier après coup, ce serait plutôt dans ce Start () qu'il faudrait intervenir pour qu'il ne réinitialise pas les valeurs entrées, je suppose.
"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

Monsieur_Jack
Messages : 12
Inscription : 16 Fév 2017 23:20

Re: [DB-AL] Modifier un GameObject avant de l'instancier

Message par Monsieur_Jack » 09 Fév 2018 12:26

Finalement, j'ai trouvé une solution... J'instancie l'objet puis je le modifie.
Mais ce que je voulais faire vu qu'on ne peut pas faire de new (par exemple new Egg() m'était refusé par le compilateur), en gros instancier l'objet mais en "mémoire" seulement pour le modifier puis une fois la modification faite et bien, l'instancier réellement dans la scène avec les modifications déjà actives ! :diable:

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

Re: [DB-AL] Modifier un GameObject avant de l'instancier

Message par boubouk50 » 09 Fév 2018 12:33

Ce que tu pourrais faire également, c'est garder en lien le dernier Egg modifié. Et c'est celui-ci que tu instancies, ça t'évite de modifier les nouvelles instances, mais en soi, appliquer des modifications après instanciation, c'est généralement ce qui est fait, comme une initialisation.
"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 »