2017-02-15 3 views
0

Итак, я хочу создать экземпляр массива игровых объектов с помощью скриптов редактора. Теперь проблема заключается в том, когда я создаю сборку, она теряет родительский элемент в иерархии. Когда я инстанцировании как ниже сценарий, он работает просто отлично:Создание массива игровых объектов не может получить родительское преобразование [Editor Scripting]

for(int i = 0; i < 20; i++){ //_dTarget.halfLength; i++){ 
    GameObject a = (GameObject)PrefabUtility.InstantiatePrefab(_dTarget.wallTile); 
    a.transform.parent = goTarget.transform; 
} 

но если я инстанцировании так:

GameObject[] testG = new GameObject[20]; 
for(int i = 0; i < 20; i++){ 
    testG[i] = _dTarget.wallTile; 
} 
for(int i = 0; i < 20; i++){ //_dTarget.halfLength; i++){ 
    GameObject a = (GameObject)PrefabUtility.InstantiatePrefab(testG[i]); 
    a.transform.parent = goTarget.transform; 
} 

они потеряли своих родителей и инстанцирован вне родителя:

Любые идеи, почему это происходит?

+0

Вы знаете, что вы можете создать экземпляр объекта и установить его родитель один вызов? [Instantiate (Object original, Vector3 position, Quaternion rotation, Transform parent)] (https://docs.unity3d.com/ScriptReference/Object.Instantiate.html) –

+0

Конечно, я это знаю! Но это другое. Это редактор сценариев. –

+0

Вы пытались преобразовать метод. SetParent вместо назначения родителя? –

ответ

1

Прежде чем вы сможете установить родительский элемент, вам необходимо отключить новый объект от сборника. Вы делаете это с PrefabUtility.DisconnectPrefabInstance.

Пример:

for (int i = 0; i < 20; i++) 
{ 
    GameObject a = (GameObject)PrefabUtility.InstantiatePrefab(testG[i]); 
    PrefabUtility.DisconnectPrefabInstance(a); 
    a.transform.parent = goTarget.transform; 
} 
+0

Он работает! Но почему я должен это делать? Не могли бы вы объяснить это? –

+1

При редактировании подключенного экземпляра это похоже на редактирование фактического сборника. Любые изменения, которые вы сделаете, будут записаны (и могут быть перечислены в [PrefabUtility.GetPropertyModifications] (https://docs.unity3d.com/ScriptReference/PrefabUtility.GetPropertyModifications.html)), но не вступят в силу или не будут сохранены в prefab, перед вызовом [PrefabUtility.SetPropertyModifications] (https://docs.unity3d.com/ScriptReference/PrefabUtility.SetPropertyModifications.html). Поэтому, если вы хотите только изменить экземпляр, а не фактический сборник, он должен быть отключен первым. –

+0

Спасибо, что много объяснений сэр! Теперь я знаю, как это работает. :) –

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

  • Нет связанных вопросов^_^