Jump to content
Unity Insider Forum

Gameobjekte wieder löschen


peachplayer

Recommended Posts

Hallo Leute

Leider funktioniert es immer noch nicht mit dem löschen der instanzierten GameObjekte. Weiss jemand wie das geht?

  GameObject obj = (GameObject)Instantiate(ernten, new Vector3(newX, 1f, newZ), Quaternion.identity);



                    pooledObjects.Add(obj);

...
  
IEnumerator DestroyGraph()
    {

        int k; // einfache Zaehlvariable

     

        UnityEngine.Debug.Log("pooledObjects=" + pooledObjects.Count);

        for (k = 0; k < pooledObjects.Count; k++)
        {

                Destroy(pooledObjects[k]);

          
        }

  
        yield return null;
    }
 

Leider wird immer nur die zuletz erstelle Parzelle gelöscht. Wo steckt hier der Fehler?

 

Gruss, Peachplayer

Link zu diesem Kommentar
Auf anderen Seiten teilen

@peachplayer
Du musst immer Referenzen auf deine instanzierten GOs behalten (indem du die GOs in eine Liste oder in ein Array packst), dann kannst du diese später auch wieder mit Destroy löschen. Wenn diese immer noch nicht gelöscht werden, dann erzeugst du vermutlich immer noch irgendwo mit Instantiate GOs die du in keiner Liste zwischenspeicherst. Ansonsten waren deine Codebeispiele mit dem Löschen der GOs anhand einer Liste soweit richtig.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Kann halt auch sein, dass die Schleife beim Instanziieren kaputt ist und die Objekte falsch erzeugt oder falsch in die Liste einträgt. Aber ja, das war meine Kernaussage: Wenn du eine Liste hast und da genau einmal alle GameObjects drin sind, die du löschen willst, dann funktioniert das auch, und dein Code dafür hat dabei keine sichtbaren Fehler.

Link zu diesem Kommentar
Auf anderen Seiten teilen

 IEnumerator BarGraph()
    {
        
        int i = 0;
        float offsetX = 0f;
        float offsetZ = 0f;
        float abstandX = 10f;
        float abstandZ = 15f;
        int x; // einfache Zaehlvariable
        int z; // einfache Zaehlvariable

        float newX;
        float newZ;
        i = 0;
        int k = 0;

        float total = 0;
        int index1 = dropdown1.value;

        pooledObjects = new List<GameObject>();
        pooledObjects1 = new List<GameObject>();
        pooledObjects2 = new List<GameObject>();

        var parzellen1 = liste5.Where(c => c.Kultur == dropdown1.options[index1].text && c.Datum.Year == 2020);
        foreach (var parzelle in parzellen1)
        {
           

            UnityEngine.Debug.Log(parzelle.Parzellenname + parzelle.Fläche);
            total += parzelle.Fläche;
            for (z = 0; z < 10; z++)
            {
                for (x = 0; x < 12; x++)
                {
                    k = z * 12 + x;


                    newX = offsetX + i * 250 + x * abstandX;
                    newZ = offsetZ + i * 0 + z * abstandZ;

                   obs = (GameObject)Instantiate(prefabHaus[i], new Vector3(newX, 1f, newZ), Quaternion.identity);
                    if (i == 0)
                    {
                        pooledObjects.Add(obs);
                        Destroy(obs, 5);
                    }
                    else if (i == 1)
                    {
                        pooledObjects1.Add(obs);
                        Destroy(obs, 8);
                    }
                    else if (i == 2)
                    {
                        pooledObjects2.Add(obs);
                        Destroy(obs, 10);
                    }
                    
                    }

            }
            i++;
            
            UnityEngine.Debug.Log("i =" + i);
            UnityEngine.Debug.Log("Anz Objekte in Liste =" + pooledObjects.Count);
        }


        totalAren.text = "Total Fläche (in Aren): " +  total.ToString();
        
        yield return null;


    }

  

    IEnumerator DestroyGraph()
    {

        int k; // einfache Zaehlvariable



        UnityEngine.Debug.Log("pooledObjects=" + pooledObjects.Count);

        for (k = 0; k < pooledObjects.Count; k++)
        {

            Destroy(pooledObjects[k]);
            Destroy(pooledObjects1[k]);
            Destroy(pooledObjects2[k]);
        }
            i++;
            UnityEngine.Debug.Log("i =" + k);
            UnityEngine.Debug.Log("Anz Objekte in Liste =" + pooledObjects.Count);
   

        UnityEngine.Debug.Log("z2 = " + i);
        UnityEngine.Debug.Log("pooledObjects2 =" + pooledObjects.Count);
  
        yield return null;
    }

Habe die zu instanzierenden Prefabs in ein Array "gesplittet", d.h. jede Parzelle stellt ein separates Array dar. Jetzt kann gar keine Liste mehr gelöscht werden manuell mit der Funktion "DestroyGraph()". Da kann doch etwas nicht stimmen?

 

Gruss, peachplayer 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich bin ziemlich verwirrt - du löschst die Objekte schon direkt beim Erstellen. Zwar mit Verzögerung, aber trotzdem direkt dann. Du löschst die Dinger also alle zweimal. Da sollte schon einiges an Fehlermeldungen in der Konsole auftauchen.

Die drei durchnummerierten Listenvariablen lassen wir gerade mal außen vor. Dass deine Methoden alle Coroutinen sind, die keine yield-Statements außer direkt vorm Ende haben, auch.

Was mir aber noch auffällt ist, dass du dreimal etwas in eine Liste tust und danach nicht mehr. Ab i == 3 wird das instanziierte Objekt in keine Liste mehr gepackt. Kann sein, dass i nur bis 2 geht, aber ist natürlich eine mögliche Fehlerquelle.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...