2017-02-15 2 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

あなたがオブジェクトをインスタンス化し、それが1回の呼び出しで親の設定ができることを知っていますか? [インスタンス化(オブジェクトオリジナル、ベクトル3位置、クォータニオンローテーション、親変換)](https://docs.unity3d.com/ScriptReference/Object.Instantiate.html) –

+0

もちろん、私はそれを知っています!しかし、このことは異なっている。エディタのスクリプトです。 –

+0

parentを代入するのではなく、transform.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)でリストアップされます)、有効になりません。 [PrefabUtility.SetPropertyModifications](https://docs.unity3d.com/ScriptReference/PrefabUtility.SetPropertyModifications.html)を呼び出してください。したがって、実際のプレハブではなくインスタンスのみを変更したい場合は、まず切断する必要があります。 –

+0

説明宜しくありがとうございました!今私はそれがどのように機能するか知っています:) –

関連する問題