Jump to content
Unity Insider Forum

GameObject ersetzen und nicht nur inaktiv setzen...


Andy09

Recommended Posts

Mahlzeit 🙂

ich habe mir ein kleines C#-Script geschrieben, dass mir ein Grid erzeugen soll mit beliebigen Prefabs. Funktioniert auch alles.

Jetzt möchte ich eine Methode schreiben, die z.B. bei Zeile 5, Spalte 5 das GameObject entfernt und ein anderes einsetzt. Ich glaube auch bereits auf dem richtigen Weg zu sein. Die Prefabs mĂŒssen glaube ich zur Laufzeit in einem Ressourcen-Ordner sein. Da habe ich auch mein zweites Test-Prefab angelegt und es wird auch geladen.

Jetzt habe ich nur das Problem, ich weiß nicht wie ich das "alte" GameObject zerstören soll. Soweit ich gelesen habe gibt es die SetActive(false) Methode. Aber, ich möchte es nicht deaktivieren, ich möchte es komplett ersetzen. Schon alleine wegen dem Speicher und der Performance.

Gruß
Andy

PS: Wieso dauert es bei mir eigentlich mehrere Minuten (und ich ĂŒbertreibe nicht) bis der Post gepostet wird? Der Kreis dreht sich, und dreht sich, und dreht sich...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Guck mal hier :
https://docs.unity3d.com/ScriptReference/GameObject.html

Unter den Static Methoden findest du Destroy.
Wenn du da mal drauf klickst findest du einige Beispiele. Da siehst du dann wie und was alles zerstört werden kann.

Der normale Destroy-Befehl wird am Schluß eines Zyklusses vollzogen. Also alles was dann noch in der Update des Objektes zu tun ist, wird auch sauber gemacht.
Du kannst also ein Gameobjekt, wenn dein Script eine Referenz daraf gebildet hat, von der Ferne zerstören, oder es sich selbst zerstören lassen.
So kann das Objekt, wenn es zerstört wird, z.B. selber noch ein Explosions-Objekt instanzieren, welches sich wiederum auch selber zerstören kann.

Es gibt auch noch das DestroyImmediate, was ein Objekt sofort zerstört. Also auf der Stelle! Das solltest du aber nur Nutzen wenn du Editordinge machst, sonst nie!!!
Im Spiel wĂŒrden dann nĂ€mlich Referenzen zu diesem Objekt nicht gelöscht werden und dann wird es unweigerlich irgendwann zu Fehlermeldungen und evtl. zum Crash kommen.
Also einfach nur das Destroy nutzen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 17 Stunden schrieb Andy09:

Die Prefabs mĂŒssen glaube ich zur Laufzeit in einem Ressourcen-Ordner sein.

Nicht unbedingt. Der Ressourcen-Ordner ist, wenn du mich fragst, auch fĂŒr 98% der Probleme eine schlechte Lösung. Einfach schon, weil man Strings zum Identifizieren der Assets benutzt.

Meistens besser: Ein serialisiertes Feld anlegen (wenn nicht bekannt: einfach "public GameObject prefab;") und da dein Prefab im Inspektor rein ziehen.

vor 17 Stunden schrieb Andy09:

Aber, ich möchte es nicht deaktivieren, ich möchte es komplett ersetzen. Schon alleine wegen dem Speicher und der Performance.

So ein GameObject hat, wenn du nicht Shakespeare in eine Komponente rein pastest, nicht mal ein KB groß. Mach dir mal nicht wegen drei GameObjects um deinen Speicher Sorgen.

TatsĂ€chlich gibt es eine Technik Namens "Pooling", die Objekte recycelt, also deaktiviert und dann wieder re-aktiviert, anstatt ein neues Objekt zu instanziieren, weil Zerstören und Instanziieren weitaus schlechter fĂŒr die Performance ist als zeitweises Deaktivieren. Nicht, dass das fĂŒr dich einen Unterschied machen sollte, daher einfach weiter im Kurs - aber ich konnte das nicht stehen lassen, ohne den Samen des Zweifels an dieser Ansicht zu sĂ€hen ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefĂŒgt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rĂŒckgĂ€ngig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

LĂ€dt...
×
×
  • Neu erstellen...