Jump to content
Unity Insider Forum

Ein Script vom GameObject hat eine Referenz auf das Prefab aber beim Instanzieren dann auch sich selbst? Ein Bug?


Thariel

Recommended Posts

Hi

Ich erstelle ein Cube und lege darauf ein Script mit dieser Variable:

public GameObject goCube;

Dann erstelle ich vom Cube ein Prefab.

Jetzt ziehe ich das Prefab in den goCube Slot im Cube in der Szene und Update das Prefab. Jetzt hat der Cube eine Referenz auf sein Prefab in den Assets und könnte im Script eine neues Prefab von sich selbst Instanzieren.

Wenn ich jetzt einen neuen Cube spawne (per Script oder Drag & Drop von den Assets in die Szene), dann hat er nicht mehr die Referenz auf das Prefab in den Assets, sondern auf sich selbst.

Das ist irgendwie unlogisch. Ich hab ja nicht die Referenz auf sich selbst gegeben, sondern auf das Prefab in den Assets. Sollte also nicht der neu instanzierte Cube wieder eine Referenz auf das Prefab in den Assets haben?

Man muss doch in einem Script ein neues GameObject von sich selbst Instanzieren können, also eine "frische" Kopie vom Prefab, jedoch nicht sich selbst?

Was denkt ihr? Wie kann ein GameObject eine "frische" Instanz von sich selbst spawnen?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ok, das scheint aber schon lange ein Bug zu sein.

Hier ein Thread der ganz aktuell ist:

https://forum.unity.com/threads/prefab-with-reference-to-itself.412240/

Hier ein Thread aus dem 2010 (!!)

https://forum.unity.com/threads/reference-to-prefab-changing-to-clone-self-reference.57312/

Hab das ganze jetzt anders Designt. 

Schönen Abend noch allen 🙂

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 5 weeks later...

Ich bin der Meinung, dass es kein Bug ist. Für mich ist das eher logisch, auch wenn es ärgerlich ist, weil man vllt das mal so brauchen könnte ^^.
Alle Referenzen die zu dem selben Objekt zeigen und darunter liegenden (Childs) werden ja beim Erstellen, auf das erstellte Objekt zeigen . Beispiel:

TankGo [TankScript]
-> TurretGo

Nun hast du in Tankscript ein Verweis auf TurretGo, weil du den ja steuern willst. Wie sollte sich nun es in Runtime verhalten? Auf den Child TurretGo verweisen oder den im Assetordner? Logischerweise auf dem erstellten im Runtime bzw. wenn man selber in die Scenen reinschiebt.

Jetzt willst du ja nicht, wenn du diesen Tank prefab rein draggst oder erstellst, dass es auf diesen Turret im Assetordner zeigt, sondern bei den erstellten Sceneobjekt. Und das selbe gilt auch beim Root-Gameobject -> TankGo. Ist also ein völlig normales Verhalten.

Daher finde ich, dass es kein Bug ist.

Dennoch finde ich, dass irgendwie ne Möglichkeit geben sollte z.B. mit Attributen oder so, dass erkennen zu lassen, dass man es den Asset meint. 

Meine Idee - Workaround

#1
Wenn es unbedingt im Script selbst sein muss Quasi: TankScript.prefab
Ein Scriptableobject mit einer Liste erstellen. Den gleichen Prefab da reinpacken. Danach einfach durch loopen bis die Namen passen und dann holst du den Prefab daraus. TankScript.Prefabs.GetPrefab(TankScript.prefab.name). Kombiniert mit OnEnable oder OnValidate müsste sogar beim Reinziehen funktionieren. Man kann ScriptableObject auch als Singleton machen, wenn es sein muss. Man kann natürlich pro prefab auch ein ScriptableObject erstellen, aber da hat man bestimmt irgendwann einfach haufenweise davon.

#2
In Spawnscript schreiben (was ja meist so üblich ist) und nachdem es erstellen wurde man Prefabwert wieder neu setzen.

#3 - Ungetestet
Customeditor schreiben bissel rumfummeln und gucken was so möglich ist ^^. 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Vielleicht habe ich den hier beschriebenen Bug nicht ganz verstanden, aber... mein Bug Report bezog sich auf zwei unterschiedliche GOs: Das Prefab und die Prefab-Instanz. Die Instanz referenziert ein Prefab (also ein anderes GO), aber die Referenz ändert sich dann beim Start des Play Modes.

Wenn man ein Prefab instanziiert, müssen natürlich alle Referenzen auf irgendein Objekt des Prefabs durch die äquivalenten Referenzen der Instanz geändert werden; ganz klar.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ist schon ein Weilchen her, aber nochmal ganz kurz zusammen gefasst:

Ein Prefab ist in der Szene. Dieses Prefab hat ein Script mit einer Referenz auf sein eigenes Prefab in den Assets.

Wenn jetzt das Script dieses Prefab Instanziert, dann ist im neuen Prefab in der Szene nicht mehr die Referenz auf das Prefab in den Assets, sondern auf sich selbst.

Für mich wäre es logisch, dass es wieder eine Referenz auf das Prefab in den Assets hat.

Ich verstehe aber, dass man dies nicht mehr ändert, weil es könnte durchaus bei vorhandenen Projekten Probleme verursachen.

Am einfachsten ist es, wenn man das Prefab von einem anderen Script aus Instanziert.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 22 Stunden schrieb Thariel:

Ist schon ein Weilchen her, aber nochmal ganz kurz zusammen gefasst:

Ein Prefab ist in der Szene. Dieses Prefab hat ein Script mit einer Referenz auf sein eigenes Prefab in den Assets.

Wenn jetzt das Script dieses Prefab Instanziert, dann ist im neuen Prefab in der Szene nicht mehr die Referenz auf das Prefab in den Assets, sondern auf sich selbst.

Für mich wäre es logisch, dass es wieder eine Referenz auf das Prefab in den Assets hat.

Ich verstehe aber, dass man dies nicht mehr ändert, weil es könnte durchaus bei vorhandenen Projekten Probleme verursachen.

Am einfachsten ist es, wenn man das Prefab von einem anderen Script aus Instanziert.

Also ist ja fast wie meine beschriebene #2.
Dann kannst du ja direkt den Prefabwert wieder überschrieben, wenn es erstellt wurde.

Für mich ist das immer noch logischer, wenn es auf sich selbst zeigt, wie ich schon oben beschrieben habe. Wie gesagt: Im Prefab alles was auf sich selbst, drüber oder drunter (parent, child) zeigt, wird automatisch zum den Instanzen zeigen. Daran ist nichts unlogisch finde ich.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...