簡體   English   中英

為什么我的腳本會破壞資產? 統一

[英]Why is my script destroying assets? Unity

在我的劇本我實例化障礙(預制件存儲在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)

僅當障礙物陣列大小固定時才有效。

你知道我該如何解決嗎?
如果您需要更多詳細信息,請詢問我。 感謝幫助!

我認為這里的主要脫節是理解數組在 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");
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM