“Unity3D”索引超出范围异常:数组索引超出范围(尝试在命中时更改精灵)

时间:2016-09-18 16:20:26

标签: c# arrays unity3d unityscript unity5

早上好开发人员我知道之前已经问过这个问题,但我没有找到解决问题的方法,首先我想告诉你我只是一个统一的初学者:p,好吧,这是我的问题:我正在构建一个破砖游戏,我正在尝试做的是当它被球击中时改变砖的精灵,这样做我正在使用这个脚本:

 public int maxHits;
 public int timesHit;
 private LevelManager levelManager;
 public Sprite[] hitSprites;

 void Start () {
     timesHit = 0;
     levelManager = GameObject.FindObjectOfType<LevelManager> ();
 }

 void OnCollisionEnter2D(Collision2D collision) {
     print ("collison");
     timesHit++;
 }

     // Update is called once per frame
 void Update () {
     if (timesHit >= maxHits) {
         Destroy (gameObject);
     } else {
         LoadSprite ();
     }
     }

 void LoadSprite(){
         int spriteIndex = timesHit - 1;
         this.GetComponent<SpriteRenderer> ().sprite = hitSprites     [spriteIndex];
     }
 }

但我收到此错误:IndexOutOfRangeException: Array index is out of range. Brick.LoadSprite () (at Assets/Scripts/Brick.cs:34)

我每帧都得到它!所以它太慢了游戏场景,我再也无法测试我的游戏了。你能告诉我我做错了什么以及如何解决这个问题吗?如果你指导我学习更多关于我的错误的课程而不是再做一次,那可能会有所帮助。

4 个答案:

答案 0 :(得分:0)

这种情况正在发生,因为你的时间命中从0开始,然后当你加载一个精灵时,你扣除1给你-1。在LoadSprite的以下行中,您将尝试在索引-1(hitSprites [-1])访问您的hitSprites数组,这当然是超出范围的。

至少,我会添加一些验证来检查索引的范围。

答案 1 :(得分:0)

我无法告诉您正在做什么,但是您收到了该错误,因为您正在访问长度为&gt; = library(tidyr) extract(dat, Col1, into = c("Col1", "Col2"), "(a\\d+)\\s+(.*)") 的索引。

在使用之前,您应该检查hitSprites变量是否小于spriteIndex长度。

您的新hitSprites功能应为:

LoadSprite

答案 2 :(得分:0)

你需要将spriteIndex钳位到小于0(第一个数组索引)并且将hitSprites.Length减少1(最后一个数组索引)。

void LoadSprite(){
         int spriteIndex = Mathf.Clamp(timesHit - 1, 0, hitSprites.Length - 1);
         this.GetComponent<SpriteRenderer> ().sprite = hitSprites [spriteIndex];
     }
 }

提示: 不要在Update中调用过多的GetComponent。在awake中预取所有组件以供以后使用。

private SpriteRenderer _spriteRenderer;

void Awake()
{
_spriteRenderer = GetComponent<SpriteRenderer> ();
}

答案 3 :(得分:0)

@Programmer @ Dan-Cook @ user2867426 拳头,我要感谢大家的答案,我从你们那里学到了很多,非常感谢你! 好吧我有点错误修复了我的错误大声笑。 当我优化我的代码时,我注意到我在update()中使用了这个条件,而我可以将它直接用于OnCollisionEnter2D():

if (timesHit >= maxHits) {
     Destroy (gameObject);
 } else {
     LoadSprite ();
 }

以某种方式解决了我的问题,我不知道如何, 也许问题是它被称为每一帧,现在它不是! 如果你们可以向我解释如果移动,如果条件从update()修复问题我真的很感激它^^ 再次感谢所有人。