我希望在旋转时使用'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 () {
}
}
答案 0 :(得分:2)
问题在于:public Transform[] spawnPoints;
spawnPoints
变量声明为public,这意味着您希望通过编辑器填充它。您没有这样做,尺寸仍然 0 。当尺寸为0
时,Random.Range
会执行此操作Random.Range(0,0)
并返回0
。当您将0
作为spawnPoints
变量的索引时,它会抛出该错误,因为spawnPoints
中没有任何内容。您必须设置大小。
这就是现在的样子:
这应该是这样的:
注意我是如何将变换拖到第二个屏幕截图上的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)