在Unity 2D中产生敌人

时间:2017-11-11 16:37:02

标签: c# unity3d unityscript

我希望在旋转时使用'spawn'让我的敌人从顶部出现。

但我收到了这个错误:

  

IndexOutOfRangeException:数组索引超出范围。   spawnScript.addEnemy()(在Assets / Scripts / spawnScript.cs:21)

以下是我的剧本:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class spawnScript : MonoBehaviour {

public Transform[] spawnPoints;
public GameObject enemy;
public float spawnTime = 5f;
public float spawnDelay = 3f; 

// Use this for initialization
void Start () {
    InvokeRepeating ("addEnemy", spawnDelay, spawnTime);

}

void addEnemy() {
    // Instantiate a random enemy.
    int spawnPointIndex = Random.Range(0, spawnPoints.Length);
    Instantiate (enemy, spawnPoints[spawnPointIndex].position, spawnPoints[spawnPointIndex].rotation);
}

// Update is called once per frame
void Update () {

}
}

2 个答案:

答案 0 :(得分:2)

问题在于:public Transform[] spawnPoints;

spawnPoints变量声明为public,这意味着您希望通过编辑器填充它。您没有这样做,尺寸仍然 0 。当尺寸为0时,Random.Range会执行此操作Random.Range(0,0)并返回0。当您将0作为spawnPoints变量的索引时,它会抛出该错误,因为spawnPoints中没有任何内容。您必须设置大小。

这就是现在的样子:

enter image description here

这应该是这样的:

enter image description here

注意我是如何将变换拖到第二个屏幕截图上的spawnPoints数组插槽中的。如果您不这样做,则会出现NullException错误。

如果您不想在不设置大小的情况下获得该错误,请在使用之前检查spawnPoints.Length > 0是否正确。

if (spawnPoints.Length > 0)
{
    int spawnPointIndex = UnityEngine.Random.Range(0, spawnPoints.Length);
    Instantiate(enemy, spawnPoints[spawnPointIndex].position, spawnPoints[spawnPointIndex].rotation);
}

通过将spawnPoints设为public,我们假设您要从编辑器中设置size。您也可以从脚本设置size,但首先将其设为private变量,这样您就不会遇到问题:

void Start()
{
    //Set the size to 3 then fill it up
    spawnPoints = new Transform[3];
    spawnPoints[0] = yourPint1;
    spawnPoints[1] = yourPint2;
    spawnPoints[2] = yourPint3;
}

答案 1 :(得分:0)

错误 - int spawnPointIndex = Random.Range(0, spawnPoints.Length);

你应该写 - Random.Range(0, spawnPoints.Length - 1)