为什么我的脚本会破坏资产?统一

时间:2016-03-20 21:53:51

标签: c# unity3d

在我的脚本中,我在变换位置(prefabObstacles数组)实例化障碍物(预制件存储在emptyTransforms数组中)。此脚本附加到gameobject,这是世界的一部分。该段被动态实例化并销毁。

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

正在发生此错误:

  

不允许销毁资产以避免数据丢失   如果您确实要删除资产,请使用DestroyImmediate (theObject, true);
  UnityEngine.Object:消灭(对象)
  ObstaclePlacer:OnDestroy()(在Assets / Scripts / ObstaclePlacer.cs:37)

仅当障碍物阵列大小固定时才有效。

你知道我该如何解决这个问题吗? 如果您需要更多细节,请问我。谢谢你的帮助!

1 个答案:

答案 0 :(得分:1)

我认为这里主要的断开是理解数组如何在C#中工作。初始化时必须声明数组的长度,这与其他集合(如通用列表)不同,后者允许您根据需要动态增大或缩小列表。各种集合和数组之间存在更深层次的差异,在您确定哪种集合和数组最适合您的应用程序之前,您需要了解它们。

此示例显示如何在行为脚本的上下文中声明和初始化数组和GameObjects类型的泛型列表的实例,显然,您希望在实际脚本中使用其中一个。

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");
        }
    }
}