2015-09-25 163 views
0

的我正在使用此代码从一个阵列产生一个随机对象:数组索引超出范围错误

using UnityEngine; 
using System.Collections; 

public class enemySpawner : MonoBehaviour { 

    public GameObject[] enemies; 
    int enemyNo; 
    public float maxPos = 6.9f; 
    public float delayTimer = 0.75f; 
    float timer; 

    void Start() { 
     timer = delayTimer; 
    } 

    void Update() { 

     timer -= Time.deltaTime; 

     if (timer <= 0) { 

      Vector3 enemyPos = new Vector3 (transform.position.x, Random.Range (5.0f, -5.5f), transform.position.z); 

      //enemyNo = Random.Range (0,8);  
      enemyNo = Random.Range (0, enemies.Length); 

      Instantiate (enemies[enemyNo], enemyPos, transform.rotation); 
      timer = delayTimer; 
     } 
    } 
}  

的问题是我想做的事情在不同的场景一样的东西。每个场景都有针对阵列的不同量的对象(在检查器中设置),这样因为他们不都是一样的,我得到这个错误:

IndexOutOfRangeException: Array index is out of range. 

有没有办法为我做到这一点不同?或者我应该为每个场景编写一个新脚本?

+1

你在初始化敌人数组? – JoaoFSA

+0

@JoaoFSA Unity有一个Inspector,你可以初始化公共变量。 – DogeAmazed

+0

不知道在Unity中是否可以使用,但是可以使用“列表”而不是Array吗? – PoweredByOrange

回答

3

您需要获取数组的当前长度,以便您不能脱离当前数组范围。

enemyNo = Random.Range (0, enemies.Length) 
+0

谢谢。刚刚尝试过这样,敌人依然在产卵,但错误依然存在。错误肯定来自这个脚本,所以我会更新我的答案,让完整的脚本看看它是否来自其他东西。 – JGrn84

+1

它应该是'enemies.Length -1',max是包含性的。 –

+1

@shadowlif这就是我的想法,这就是为什么我认为它一定是别的原因造成的问题。我已经完成了该项目,并从所有游戏对象中删除了该脚本,并将其更改为敌人。然后将所有内容都放回原位。我现在可以肯定地确认敌人。长期完美的作品。还有一个关于将元素保留为0的进一步注释,我必须在我使用它的其中一个场景中犯了错误。 - 删除了上面的评论,以保存混乱:) – JGrn84