foreach Transform 同时chils.setParent引起的bug

时间:2023-03-09 09:52:47
foreach Transform 同时chils.setParent引起的bug

Transform继承自IEnumerable,可以对它进行迭代。但当你在迭代的同时,又对child进行setParent操作时,会出现意想不到的结果。

下面是我使用foreach和getchild得到的bug,及解决办法。

使用foreach

当在使用foreach获取所有的child,并且同时修改child的parent为其它,会出现只能修改部分,但不会报错。

foreach (var tran in rideEffect.InstanceAsset.transform)
{
var child = tran as Transform;
if (child == null)
{
continue;
}
KTool.SetChild(child, boneTrans.transform);
}

使用GetChild

使用getchild获取每一个child,同时设置child的parent为其它时,会报:Transform child out of bounds

var childCount = rideEffect.InstanceAsset.transform.childCount;
for (int idx = ; idx < childCount; idx++)
{
var child = rideEffect.InstanceAsset.transform.GetChild(idx);
KTool.SetChild(child, boneTrans.transform);
}

解决办法

添加一个扩展方法获取所有的childs,存起来。

或者也可以不写扩展方法,直接使用List<Transform>存child。

public static IEnumerable<Transform> GetChildren(this Transform tr)
{
List<Transform> children = new List<Transform>();
foreach (Transform child in tr)
{
children.Add(child);
}
// You can make the return type an array or a list or else.
return children as IEnumerable<Transform>;
}

调用方法,这样就可以修改完全部的child

var childs = rideEffect.InstanceAsset.transform.GetChildren();
foreach (var child in childs)
{
KTool.SetChild(child, boneTrans.transform);
}