Проблема в том, что вы перебираете rayhit.transform.childCount
.
При удалении дочернего элемента из-за rayhit.transform.GetChild(i).transform.SetParent
значение rayhit.transform.childCount
уже уменьшается на единицу.
Поэтому в следующей итерации i
может быть уже больше rayhit.transform.childCount
, поэтому, например, второй объект не перемещен в нового родителя!
Вместо этого вы можете использовать
// do this only once
var targetParent = nodes[smallestId].transform;
if(targetParent > 0)
{
targetParent = targetParent.GetChild(0);
// do also this only once
var node = targetParent.GetComponent<Node>();
var toMove = new List<Transform>();
foreach (Transform child in rayhit.transform)
{
node.sticks.Add(child.GetComponent<Stick>());
toMove.Add(child);
}
foreach(var child in toMove)
{
child.SetParent(targetParent);
}
Destroy(rayhit.transform.gameObject);
}
else
{
rayhit.transform.SetParent(targetParent);
Debug.Log("Stick : " + targetParent);
}
Который сначала сохраняет их все в списке, так что вы не зависите от того, перенесены ли они уже к новому родителю или нет.
В качестве альтернативы, я думаю, вы могли бы даже использовать GetComponentsInChildren
здесь, что полностью избавит вас от неприятностей, и вам вообще не нужно будет использовать две петли:
var targetParent = nodes[smallestId].transform;
if(targetParent > 0)
{
targetParent = targetParent.GetChild(0);
// do also this only once
var node = targetParent.GetComponent<Node>();
// These references now don't depend on their parent object
// so you can safely iterate on them without any issues
foreach (var stick in rayhit.transform.GetComponentsInChildren<Stick>(true))
{
node.sticks.Add(stick);
stick.transform.SetParent(targetParent);
}
Destroy(rayhit.transform.gameObject);
}
else
{
rayhit.transform.SetParent(targetParent);
Debug.Log("Stick : " + targetParent);
}