Unity-GetComponentsInChildren <T>()返回顺序

agi*_*iro 3 c# initialization unity-game-engine

我知道它会返回在父级层次结构中找到的给定组件,但是按什么顺序?我需要知道,因为我想使用它来初始化脚本,并且必须先初始化父级,然后再初始化子级(因为较低层次的组件使用其直接父级的计算值)。

Lin*_*een 6

Unity文档中关于GetComponentsInChildren的文档不保证特定的退货顺序-因此,即使您在当前版本中找到确定性的订单,当Unity发行更改该确定性顺序的新版本时,也很容易损坏。因此,您需要在自己的代码中强制执行parent-initialization-first保证。一种方法是迭代转换:

void InitializeHierarchy(Transform root)
{
    var initializable = root.GetComponent<Initializable>();
    if(initializable != null) initializable.Initialize();
    foreach(Transform t in root)
    {
        if(t == root) continue;  //make sure you don't initialize the existing transform
        InitializeHierarchy(t); //initialize this Transform's children recursively
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:这将在直接孩子之前初始化直接父母-但是不会在侄女/侄子之前初始化阿姨/叔叔。

  • @Allen 从 Unity 5.5.0f3 开始,情况并非如此——GetComponentsInChildren 在层次结构中递归地返回组件。 (2认同)