2016-03-20 13 views
-1

私のスクリプトでは、変換位置(emptyTransforms配列)に障害物(プリファブはprefabObstaclesの配列に格納されています)をインスタンス化します。このスクリプトは、世界の一部であるgameobjectに添付されています。このセグメントは動的にインスタンス化され、破棄されます。スクリプトが資産を破壊するのはなぜですか? Unity

public class ObstaclePlacer : MonoBehaviour 
{ 
    public int obstaclesAmmount; 
    public GameObject[] prefabObstacles; 
    public Transform[] emptyTransforms; 
    public GameObject[] obstacles; 

    void Start() 
    { 
     GenerateObstacles(); 
    } 

    void GenerateObstacles() 
    { 
     for(int i = 0; i < Random.Range(0,obstaclesAmmount); i++) 
     { 
      GameObject objToSpawn = prefabObstacles[Random.Range(0, prefabObstacles.Length)]; 
      obstacles[i] = Instantiate(objToSpawn, (emptyTransforms[Random.Range(0, emptyTransforms.Length)].position+new Vector3(0.0f, 1.0f)), Quaternion.identity) as GameObject; 
     } 
    } 

    void OnDestroy() 
    { 
     foreach(GameObject item in obstacles) 
     { 
      Destroy(item); 
     } 
    } 
} 

このバグが発生している:

を資産の破棄は、データの損失を回避するために許可されていません。
UnityEngine.Object
DestroyImmediate (theObject, true);あなたが本当に資産の使用を削除する場合:(オブジェクト)を破壊
ObstaclePlacer:(資産/スクリプト/ ObstaclePlacer.csで:37)OnDestroy()

これはのみ動作します障害物配列のサイズが固定されている場合

どうすれば修正できますか?
詳細が必要な場合は、私に尋ねてください。手伝ってくれてありがとう!

+0

あなたは、オブジェクトが破棄されたときに明らかに呼び出される 'void OnDestroy()'を持っています。 'void OnDestroy()'のコードでは、他のすべての項目を破棄するように指示しています。もちろん、そうしています。 – Fattie

+0

@Joe Blowしかし、なぜシーン内のゲームオブジェクトの代わりに資産を破壊しているのですか? Alesoはこれをやっていないし、このエラーが発生します。 –

+1

あなたは 'public GameObject [] obstacles'で何を割り当てていますか?これにはプロジェクト資産フォルダのプレハブが含まれていますか? –

答えて

1

ここでの主な切断は、C#での配列の動作を理解することだと思います。初期化時に配列の長さを宣言する必要があります。これは、汎用リストなどの他のコレクションとは異なり、必要に応じて動的にリストを拡大または縮小できます。さまざまなコレクションと配列の間にはより深い相違点があります。これは、アプリケーションに最適なものを決定する前に理解しておく必要があります。

この例では、Behavior Scriptのコンテキストで配列のジェネリックリストとジェネリックリストの両方のインスタンスを宣言して初期化する方法を示します。実際のスクリプトでどちらか一方を使用することは明らかです。

class ObstaclePlacer : MonoBehaviour 
{ 
    public int obstaclesAmmount; 
    public GameObject [] obstaclesArray; 
    public List<GameObject> obstaclesList; 

    public void Start() 
    { 
     var random = new System.Random(); 
     //Get the desired size of your array. 
     obstaclesAmmount = random.Next(0, 100); 
     //Initialize an array with the size of your random number 
     obstaclesArray = new GameObject [obstaclesAmmount]; 
     //Or use a list which allows your to dynamically add elements later. 
     obstaclesList = new List<GameObject>(); 

     GenerateObstacles(); 
    } 

    void GenerateObstacles() 
    { 


     for (int i = 0; i < obstaclesAmmount; i++) { 

      var gameObject = new GameObject(); 

      obstaclesArray[i] = gameObject; 

      obstaclesList.Add(gameObject); 
     } 
    } 

    void OnDestroy() 
    { 
     foreach (GameObject item in obstaclesArray) { 
      //Destroy (item); 
      Console.WriteLine ("Destroy (item); in obstaclesArray"); 
     } 

     foreach (GameObject item in obstaclesList) { 
      //Destroy (item); 
      Console.WriteLine ("Destroy (item); in obstaclesList"); 
     } 
    } 
} 
+0

ありがとう、本当に助かりました! –

関連する問題