2017-07-28 1 views
0

Ich versuche, alle Kinder eines Gameobject zu einem anderen zu wechseln.Unity3D: Ausgabe in durch die Kinder Schleife während sie Neuzuordnung

foreach (Transform child in transform) { 
child.parent = new_parent.transform; 
} 

Dieser Code trennt die Kinder teilweise und lässt ein paar Kinder zurück in den ursprünglichen Elternteil. Ich verwende den folgenden Code, um die obige Operation durchzuführen.

foreach (Transform child in transform) { 
    child.tag = "collected"; 
} 

GameObject[] collected = GameObject.FindGameObjectsWithTag ("collected"); 
foreach (Transform child in collected.transform) { 
    child.transform.parent = new_parent.transform; 
} 

Und das funktioniert perfekt. Ich habe auch zusammen mit parent.GetChild(i) und ähnliches Problem passiert. Wo vermisse ich?

+0

Gibt es eine Muster zu den Objekten, die weggelassen werden? – Serlite

+0

Es klingt wie Sie im Wesentlichen Elemente aus der „Liste“ von Kindern, wie Sie Schleife durch sie und ändern ihre Eltern zu entfernen können. Wenn ein "Kind" entfernt wird und sich die Liste verschiebt, verfehlt das nächste "Kind" seinen Zug in der Warteschlange. In der zweiten Schleife ist jedes "Kind" kein Kind von "gesammelt" (wie die erste Schleife) und daher können Sie das gesamte Array von 'collected' durchlaufen und die Eltern ändern, die sie nicht als Elemente des Array. – ryeMoss

Antwort

2

Wie in den Kommentaren erklärt, fehlen werden Artikel, weil Sie die Sammlung von Kindern zur gleichen Zeit sind zu modifizieren, wie Sie durch sie mit sind Iterieren ‚foreach.‘ Im Allgemeinen ist dies eine schlechte Idee und Sie sollten niemals eine Sammlung ändern, während Sie sie durchlaufen (es sei denn, Sie wissen genau, was Sie tun).

Eine Lösung, die Sie gefunden haben, ist eine Kopie der Sammlung zu machen, durch die Kopie iterieren und dann sicher Elemente aus der ursprünglichen Sammlung entfernen. Markieren der Objekte und dann FindGameObjectsWithTag Aufruf ist unnötig ineffizient, weil es durch jede einzelne Gameobject sucht, und auch fehleranfällig (wenn Sie vergessen, die Tags entfernen Sie seltsame Verhalten bekommen). Du bist besser dran macht eine Liste:

var collected = new List<Transform>(); 
foreach (var child in transform) { 
    collected.Add(child); 
} 
foreach (Transform child in collected) { 
    child.transform.parent = new_parent.transform; 
} 

noch einfacher in diesem Fall eine while-Schleife zu verwenden, ist das letzte Kind, solange die Eltern zu entfernen hat keine Kinder:

while (transform.childCount > 0) { 
    transform.GetChild(transform.childCount - 1).parent = new_parent.transform; 
} 
+0

Danke. Als ich das Elternteil des ersten Kindes wechselte, wurde das zweite Kind das erste Kind und ging zum zweiten Kind (das ist das dritte!), und das führte zur teilweisen Operation! So ist die Lektion, die Kinder für den Zugriff auf rückwärts von GetChild (KindZählwert-1). –

Verwandte Themen