Partage
  • Partager sur Facebook
  • Partager sur Twitter

C# Instantiate

Eviter de créer plusieurs clones d'un même objet

Sujet résolu
    13 mars 2022 à 18:17:36

    Bonjour,

    J'ai besoin d'aide pour un sujet de creative coding sur Unity en C#.

    Je ne sais pas si c'est le bon forum pour poser des questions sur ce langage de programmation, mais comme c'est un langage objet, je vais tenter le coup.

    Étant en train de suivre une formation en Game Design et Game Formation, j'essaye de créer, à partir d'un tableau, un certain nombre de clone d'un même objet (79 clones pour être exacte).

    Créer des clones, initialiser leur positions, leur donner un matériel et leur attribuer une fonction n'est pas un problème pour moi.

    Quand je créé les clones, je souhaite suivre cette logique : 1+1+1+1 où 1 représente le nombre de clones produits toutes les secondes, mais mon problème est le suivante : au lieu d'avoir une incrémentation de 1, pour une fonction de P = x + 1, j'ai une raison de 2, pour une fonction P = 2 * x, me donnant cette logique : 1+2+4+8.

    Pour faire simple, au lieu d'avoir les 4 premiers clones, j'ai 15 clones.

    Je ne comprends pas très bien d'où vient le problème.

    Voici mes deux scripts :

    Le script principal pour cloner :

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class RedPurpleSphereScript : MonoBehaviour
    {
        private float countertosummon,counter/*,limit*/;
    
        public GameObject RedPurpleSphere;
        private Vector3 RedPurpleMove;
    
        public TableSetScript TableSet;
    
        public string[,] Table;
    
        public List<int> counter0x, counter0y;
        public List<int> counter1x, counter1y;
        public List<int> counterspex, counterspey;
    
        public int i, j;
    
        public GameObject[] RedPurpleSphereClone;
    
        // Start is called before the first frame update
        void Start()
        {
            RedPurpleSphere = GameObject.Find("RedPurpleSphere");
            RedPurpleMove = RedPurpleSphere.GetComponent<Transform>().position;
            TableSet = GameObject.Find("Main Camera").GetComponent<TableSetScript>();
            Table = TableSet.Table;
    
            for (int i = 0; i < 14; i++)
            {
                for (int j = 0; j < 14; j++)
                {
                    if (Table[i, j] == "0")
                    {
                        counter0y.Add(i);
                        counter0x.Add(j);
                    }
                    if (Table[i, j] == "1")
                    {
                        counter1y.Add(i);
                        counter1x.Add(j);
                    }
                    if (Table[i, j] == "|")
                    {
                        counterspey.Add(i);
                        counterspex.Add(j);
                    }
                }
            }
    
            RedPurpleSphereClone = new GameObject[counter0y.Count];
    
            countertosummon = 1.0f;
    
            i = 1;
        }
    
        // Update is called once per frame
        void Update()
        {
            if(countertosummon <= 0.0f)
            {
                countertosummon = 1.0f;
                RedPurpleSphereClone[i] = Instantiate(RedPurpleSphere, new Vector3(counter0x[i], -counter0y[i] * 0.5f, 100), Quaternion.identity);
                i += 1;
            }
            countertosummon -= 0.002f;
        }
    }

    Et mon script contenant le dit tableau :

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class TableSetScript : MonoBehaviour
    {
        public string[,] Table = new string[14,14] 
        { 
        {"0","0","0","0","0","|","0","0","0","0","1","|","0","0"},
        {"0","1","0","|","0","0","0","1","1","|","0","0","1","0"},
        {"0","|","0","0","1","0","1","|","0","0","1","1","0","|"},
        {"0","0","1","1","1","|","0","1","0","0","0","0","1","0"},
        {"0","1","|","0","1","0","1","0","|","0","1","0","1","1"},
        {"|","0","1","1","0","0","|","0","1","1","0","1","|","0"},
        {"1","1","1","0","|","0","1","1","1","1","1","0","0","0"},
        {"0","|","1","0","0","0","1","|","1","0","0","1","0","|"},
        {"1","0","0","1","1","|","1","0","1","0","0","|","1","0"},
        {"1","0","1","|","1","0","1","1","0","|","1","0","1","1"},
        {"1","|","1","1","0","0","0","1","1","0","0","1","|","1"},
        {"1","0","1","0","|","1","1","0","1","1","|","1","1","1"},
        {"0","0","|","1","1","1","0","1","|","1","1","1","1","0"},
        {"|","1","1","1","1","1","|","|","|","|","|","|","|","|"}
        };
    }
    

    Et le résultat obtenu :

    Résultat obtenu

    J'ai mon orbe initiale (tout à gauche) avec ces quatre premiers clones, mais comme vous pouvez l'observer, j'ai quinze objets au lieu de cinq objets dans la hiérarchie.

    Si quelqu'un a des idées pour résoudre ce problème, sans nul doute, simple pour des programmeurs confirmés, je suis preneur.

    Merci d'avance pour toute aide ou réponse.

    EDIT : 

    Ok, je viens de comprendre le problème : en fait, il ne faut pas assigner le script à l'objet à dupliquer, sinon, les actions se répètent à l'infini.

    J'ai donc retiré le script de l'objet "RedPurpleSphere" pour le placer sur "Main Camera", comme ça, mon problème est résolu.

    Je place donc ce topic en "sujet résolu".

    -
    Edité par ReunanBeauvois 13 mars 2022 à 20:54:41

    • Partager sur Facebook
    • Partager sur Twitter
      14 mars 2022 à 9:52:21

      Faudrait quand même faire un gros ménage dans les champs de votre classe.

      C'est quoi ces champs "i" et "j" tout moisi.

      Ne confondez pas champs et variable locale.

      Prenez un peu de temps pour correctement nommer vos champs et variables locales.

      Mettez en statique tout ce qui n'est pas lié à une instance, ou utilisez un DP Singleton.

      -
      Edité par bacelar 14 mars 2022 à 9:52:31

      • Partager sur Facebook
      • Partager sur Twitter
      Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
        25 mars 2022 à 15:19:41

        Je vais rajouter un petit truc et je suis d'accord sur ce que dit mon vdd (même s'il est un peu bourrin ^^), quand tu déclares i dans ta boucle for, sa portée est locale et relative à la boucle en elle même et tu as un i=1 en dehors de la boucle. J'ai pas explorer à fond ton code mais c'est pas vraiment clair. 

        Si ton but est de savoir où tu en es dans tes incrémentations ou bien de réinitialiser, ça ne va pas. Donc si tu n'en as pas besoin ailleurs que dans ta boucle, ce que je pense, lève les ça évitera les problèmes et ça sera plus clair aussi à lire.

        Egalement pour l'incrémentation tu peux la faire via "i++;" tout simplement vu qu'ici elle n'est que de 1. C'est secondaire tu me diras.

        -
        Edité par Daerlnaxe 25 mars 2022 à 15:21:55

        • Partager sur Facebook
        • Partager sur Twitter

        C# Instantiate

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown