foreach Transform 并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 = 0; 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);
}
时间: 2024-11-10 09:31:49

foreach Transform 并setParent引起的bug的相关文章

Unity 3D之进阶篇Transform的迭代器

说在前面 我们通常使用Transform作为3D物体的一个位置属性来看待,从这个类中获取或者控制,物体的大小.位置.缩放值,或者通过transform来找到物体的子节点.but!!Transform继承了IEnumberable,是可以使用foreach遍历的. Transform // // 摘要: // /// // Position, rotation and scale of an object. // /// public class Transform : Component, IE

《Unity_API解析》 第十二章 Transform类

Transform类继承自Component类,并实现了IEnumberable接口.Transform是GameObject必须拥有的一个组件,用来管理所在GameObject对象的坐标位置.旋转角度和大小缩放.由于Transform实现了Ienumberable接口,于是可以在程序中使用foreach()方法快速遍历子物体的Transform结构.即: void Start() { foreach (Transform item in transform) { } } Transform类实

unity中遍历Transform的子物体

1.遍历Transform直接子transform private void Start() { var Equipment = building.transform.FindChild("building/building/Equipment"); foreach (Transform tran in Equipment) { Debug.LogError(tran); } } 2.递归遍历该GameObject的所有子GameObject public void Awake() {

unity transform 常用操作

1.寻找物体 1.1 寻找满足条件的子物体 ` public static Transform FindObj(Transform transform, Func<Transform, bool> condition, bool isGrandsonObj = false) { Transform[] allChilds = transform.GetComponentsInRealChildren<Transform>(isGrandsonObj); foreach (Trans

RootMotionComputer 根运动计算机

using UnityEngine; using System.Collections; /* * ---------------------------------------------------------------------------- * Creation Info * ---------------------------------------------------------------------------- * Root Motion Computer * Ver

Unity3D 基于预设(Prefab)的泛型对象池实现

背景 在研究Inventory Pro插件的时候,发现老外实现的一个泛型对象池,觉得设计的小巧实用,不敢私藏,特此共享出来. 以前也看过很多博友关于对象池的总结分享,但是世界这么大,这么复杂到底什么样的对象池才是好的呢,我们发现通用的对象池未必适应所有的环境,比如基于UI的局部(从某个Scene,到某个Dialog)对象池,范围不同,需要的对象池就有不同的要求.本文就是介绍一种基于预设(Prefab)的局部UI对象池. 通用信息提示窗口的实现http://www.manew.com/thread

移动子物体保持localPosition不变

public static GameObject lastParent; [MenuItem("GameObject/MakeParentWithLocal")] public static void MakeParentWithLocal() { //始终是按照字母排序的,第一个总是字母在前的,暂时没找到方法. foreach (Transform transform in Selection.transforms) { if (transform != Selection.acti

u3d5第一人称射击游戏(C#脚本)完整版并在iOS9.3系统上真机运行

参考资料:<Unity3D\2D手机游戏开发>(第二版) +   百度 涉及U3D的功能有:摄像机控制.物理.动画.智能寻路等. 开发工具:Unity3D5.3.4,VS2015,VMplayer12+MacOSX10.11+XCode7.3(我是Windos笔记本用的是苹果虚拟机,MAC真机不需要虚拟机,直接在appstore下载XCode最新版本就可以了,MAC最新版+Xcode最新版本可以直接真机调试运行)+OS9.3系统iphone 说一下U3D,想要在ios上调试的话就要在下载的时候

Unity3D研究之多语言用中文做KEY

 做多语言的时候用中文做KEY绝对是有100%的优点,假设用英文表示那么代码里面给文字赋值的地方全都是英文.写的代码多了以后维护起来就没有人能看懂了,或者看起来非常费劲. 对PoolManager不了解的能够看下初探PoolManager插件非常适合新手学习. 说说用中文做KEY的原理:Unity中给文字赋值的地方就两处, 一个是提前预制在UI Prefab上的文字.另一个是写在代码里面的文字.那么在开发阶段我们在Prefab和代码里面直接就写中文,等项目后期通过工具把所有中文的地方所有提取