Jump to content
Unity Insider Forum

Prefab von Instanz des selben aus erstellen


Sascha

Recommended Posts

Moin miteinander!

 

Ich habe ein merkwürdiges Problem, das nach Bug riecht. Aber vielleicht gibt es ja trotzdem eine vernünftige Lösung.

 

Ich habe ein Prefab, den PlayerContainer.

Da steckt die Spielfigur drin und ggf. noch ein wenig mehr.

Stirbt die Spielfigur, dann löscht der Container alle seine Children.

Dann wartet er die Respawnzeit ab und erzeugt einen neuen Container, also quasi sein eigenes Prefab.

Das ist wesentlich einfacher, als die Children alle wiederherzustellen.

 

Jetzt das Problem:

Das Objekt meint: "Oh, das, was du da erstellen willst, bin ja ich (nicht: "mein Prefab")!"

Also kopiert er sich selbst, anstatt eine neue Instanz des Prefabs zu erstellen - da sind ja aber die ganzen Children gelöscht...

 

Ich hab ihn mal gefragt:

print(gameObject == meinPrefabObject);

und er mein true. Autsch!

 

Hat jemand eine Ahnung, wie ich ihm klar machen kann, dass ich gerne eine neue Instanz hätte?

 

Grüße

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich fasse es mal so zusammen:

var prefab : GameObject;

function OnMouseDown()
{
   for(var t : Transform in transform)
   {
    Destroy(t.gameObject);
   }
   yield WaitForSeconds(1);
   Instantiate(prefab);
   Destroy(gameObject);
}

Das GameObject damit muss jetzt mind. ein Child-Objekt haben und "Prefab" muss eben der Prefab dieses Objekts sein.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Okay, Der Hund liegt woanders begraben, ich hatte das grade nur nicht auf dem Schirm.

Das eine Instanz eines Prefabs sich selbst kopiert wenn es eine weitere Instanz des Prefabs instanziert ist eine beabsichtigte Verhaltensweise. Ich hatte damit auch schon meine Probleme, aber ganz offensichtlich mach Unity das ganze um sich Rechenarbeit zu sparen (Ich habe noch dunkel in Erinnerung das die Begründung war, kopieren eines Objektes wäre günstiger als neuen Speicher zu allokieren).

Mein Workaround war, zwei von Grund auf identische Prefabs zu erstellen die sich gegenseitig Instanzieren. Ist halt ein Workaround.

Ansonsten musst du dir überlegen ob du doch nicht alle Variablenwerte in einer eigenen Datenstruktur speicherst und dann die Komponenten wiederherstellst.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ist ja doof :huh:

 

Dann erstelle ich mir wohl tatsächlich ein Instaniziierer-Prefab nur für dieses Prefab... mal schauen.

 

//e: Interessant...

static function Instantiate(prefab : GameObject)
{
Instantiate(prefab);
}
static function Instantiate(prefab : GameObject, position: Vector3, rotation : Quaternion)
{
Instantiate(prefab, position, rotation);
}

und ich bekommen einen StackOverflow :P

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich weiß nicht, was er da intern macht, aber ICH habe nix zyklisches gebaut :)

 

Ich rate mal ins Blaue hinein und sage, Instantiate und statischer Kontext hauen sich gegenseitig... nein, meinem RAM den Kopf ein.

Mal ausprobieren.

 

//edit: Hätt ja klappen können.

Sieht nach Instantiate(null) aus.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Eigentlich...

Uff, ich bin grade nicht am Pc kanns also nicht ausprobieren, Versuch aber mal


static function Instantiate(gO : GameObject, position : Vector3, rotation : Quaternion) : GameObject
{
return gO.Instantiate(gO, position, rotation);
}
[/Code]

Damit greifst du ja explizit Auf GameObject.Instantiate zu.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hab ich eben schon.

Problem ist, dass von vorneherein this übergeben wird, was auch immer man tut.

 

Immernoch die hübscheste der hässlichen Lösungen:

var prefab : GameObject;

function Start()
{
   Instantiate(prefab, transform.position, transform.rotation);
   Destroy(gameObject);
}

Damit ein Prefab erstellen und in den Assets überkreuz verlinken. Bäh.

Link zu diesem Kommentar
Auf anderen Seiten teilen

var prefab : GameObject;

function Start()
{
   Instantiate(prefab, transform.position, transform.rotation);
   Destroy(gameObject);
}

Göttlich. Der Traum eines jeden Programmierers. Redundanz in seiner Reinform.

Warum nur, Unity? Warum? Gib uns doch nur eine Überladung die das Instanzieren forciert! Nur eine ÜBERLADUNG!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...