2017-02-21 11 views
1

Я знаю, что он возвращает данные компоненты, найденные в иерархии родителя, но в каком порядке? Мне нужно знать, потому что я хочу использовать это для инициализации своих сценариев, и сначала мне нужно сначала инициализировать родителей, а потом детей (потому что нижние компоненты иерархии используют рассчитанные значения их прямых родителей).Unity - GetComponentsInChildren <T>() return order

ответ

3

Документация Unity для GetComponentsInChildren не гарантирует определенный порядок возврата - таким образом, даже если вы найдете детерминированный порядок в текущей версии, он может сломаться, когда Unity отправит новую сборку, которая изменит этот детерминированный порядок. Таким образом, вам нужно будет обеспечить гарантии родительской инициализации в вашем собственном коде. Один из способов сделать это были бы перебрать преобразование:

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 
    } 
} 

Примечания: это будет инициализировать прямые родитель, прежде чем прямые дети - однако он не будет инициализировать тетя/дяди перед племянницей/племянников.

+0

Кроме того, GetComponentsInChildren получит только прямые дочерние объекты текущего объекта. Решение Lincoln доставит вам все компоненты вплоть до вашего гнездования. – Allen

+0

@Allen от Unity 5.5.0f3 это не так - GetComponentsInChildren возвращает компоненты рекурсивно вниз по иерархии. –

+0

Я стою исправлен, если OP не использует более старую версию, чем 5.5. Спасибо! – Allen

Смежные вопросы