peachplayer Geschrieben 1. August 2020 Melden Share Geschrieben 1. August 2020 Hallo Leute Weiss jemand wie man zuvor erstellte Gameobjekte nachdem sie angezeigt werden wieder löschen kann? Gruss, peachplayer public GameObject[] field = new GameObject[120]; ... ...Code wo die Gameobjekte instanziert werden... ... obs = field; foreach (GameObject ob in obs) { Destroy(ob); } Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
chrische5 Geschrieben 1. August 2020 Melden Share Geschrieben 1. August 2020 Hallo Du hast es ja eigentlich selber schon geschrieben... https://docs.unity3d.com/ScriptReference/Object.Destroy.html Christoph Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
peachplayer Geschrieben 2. August 2020 Autor Melden Share Geschrieben 2. August 2020 Danke für die Antwort! Leider hatte ich mit der obigen Code-Variante keinen Erfolg! Musste die Objekt-Pooling Methode verwenden, dann klappte es! D.h. die Gameobjects zuerst in einer separaten Liste zwischen-speichern. Sonst wird immer nur das zuletzt erstellte Feld gelöscht. Gruss, peachplayer Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 2. August 2020 Melden Share Geschrieben 2. August 2020 Wenn du Objekte löschst, machst du kein Pooling. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
peachplayer Geschrieben 8. August 2020 Autor Melden Share Geschrieben 8. August 2020 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 More sharing options...
Thariel Geschrieben 8. August 2020 Melden Share Geschrieben 8. August 2020 Bin mir nicht sicher, aber ich würde das nicht so machen, eher so: IEnumerator DestroyGraph() { foreach(GameObject obj in pooledObjects) { Destroy(obj); } yield return null; } Würde es auch nicht unbedingt in eine Coroutine packen. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 8. August 2020 Melden Share Geschrieben 8. August 2020 Läuft auf dasselbe hinaus. Abgesehen von der inkorrekten Terminologie ist da kein Fehler zu erkennen, der sitzt woanders. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
peachplayer Geschrieben 8. August 2020 Autor Melden Share Geschrieben 8. August 2020 und wo genau? Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 8. August 2020 Melden Share Geschrieben 8. August 2020 Fragst du mich gerade, wo in deinem Code, den ich nicht kenne, sich ein Fehler befindet? Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Thariel Geschrieben 8. August 2020 Melden Share Geschrieben 8. August 2020 vor 5 Stunden schrieb Sascha: inkorrekten Terminologie vor 59 Minuten schrieb peachplayer: und wo genau? Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
chrische5 Geschrieben 8. August 2020 Melden Share Geschrieben 8. August 2020 Hallo Damit meint @Sascha mutmaßlich den Begriff Pooling. Christoph Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 8. August 2020 Melden Share Geschrieben 8. August 2020 Das stimmt Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Zer0Cool Geschrieben 9. August 2020 Melden Share Geschrieben 9. August 2020 @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 More sharing options...
Sascha Geschrieben 9. August 2020 Melden Share Geschrieben 9. August 2020 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 More sharing options...
peachplayer Geschrieben 9. August 2020 Autor Melden Share Geschrieben 9. August 2020 der springende Punkt ist doch der, dass immer nur das zuletzt erstellte Feld reps. Parzelle gelöscht wird und diese Parzelle mit den entsprechenden GameObjekten kann auch gelöscht werden, während die restlichen Parzellen stehen bleiben. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
chrische5 Geschrieben 9. August 2020 Melden Share Geschrieben 9. August 2020 Hallo Dann musst du vielleicht mehr Code zeigen. Christoph Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
peachplayer Geschrieben 9. August 2020 Autor Melden Share Geschrieben 9. August 2020 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 More sharing options...
Sascha Geschrieben 9. August 2020 Melden Share Geschrieben 9. August 2020 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 More sharing options...
peachplayer Geschrieben 9. August 2020 Autor Melden Share Geschrieben 9. August 2020 danke für die Antwort! Hab den Fehler gefunden! Es lag an der Coroutine "BarGraph" bzw. wie diese aufgerufen wurde... Gruss, peachplayer Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Recommended Posts
Archiviert
Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.