从数组中实例化和销毁GameObject

时间:2016-09-11 04:44:20

标签: c# arrays unity3d

我想将预制件的几个实例实例化为一个数组,每个实例都有自己的索引号,但我不断收到错误代码"对象引用未设置为对象的实例。如何摆脱这个错误,如何销毁单个对象或检索数组中每个游戏对象的属性?

using UnityEngine;
using System.Collections;

public class SpawnEnemy : MonoBehaviour {
private GameObject[] enemy;
public GameObject enemyPrefab;

// Use this for initialization
void Start () {
enemy[1] = (GameObject)Instantiate (enemyPrefab, new Vector3 (-119, 52, 483), transform.rotation);

}

// Update is called once per frame
void Update () {
    if (Input.GetButtonDown ("Fire2")) {
        Destroy (enemy[1]);
    }

   }
}

2 个答案:

答案 0 :(得分:1)

正如DrUsh所提到的,你需要初始化数组,例如:像这样:

void Start()
{
    // initialize array with a size of 5, all elements are empty
    enemy = new GameObject[5];

    // now you can work with this array, e.g. like you line:
    enemy[1] = (GameObject)Instantiate (enemyPrefab, new Vector3 (-119, 52, 483), transform.rotation);
}

使用数组的缺点是你将拥有固定数量的元素(在我的例子中为5)。如果您不知道存储在阵列中的最大对象的确切数量,则最好使用可以动态调整大小的List<GameObject>。这也需要通过放置enemy = new List<GameObject>()来初始化。

此外,您可能不希望使用硬编码索引访问数组/列表。我不知道这是否只是举例,你有一个更好的,自动的方式来创建gameobject-index对。

答案 1 :(得分:0)

在设置enemy[1]的值之前,尚未实例化数组。此外,索引应为0,而不是1,即enemy[0] = ...因为C#数组的索引从0开始。

您可以使用以下内容进行实例化和设置。

enemy = new[]
{
    (GameObject)Instantiate(enemyPrefab,
        new Vector3 (-119, 52, 483), transform.rotation)
};