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

本文关键字:范围 索引 精灵 Unity3D quot 异常 数组 | 更新日期: 2023-09-27 18:07:23

早上好,开发人员我知道以前有人问过这个问题,但我没有在这些答案中找到解决问题的方法,首先我想告诉你,我只是一个团结的初学者: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)

我每帧都在拍!,所以这太慢了,我不能再测试我的游戏了。你能告诉我我做错了什么以及如何解决吗?如果你指导我参加一门课程,了解更多关于我的错误的信息,并且不再这样做,这可能会有所帮助。

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

之所以会发生这种情况,是因为你的时间命中从0开始,然后当你加载一个精灵时,你会扣除1,得到-1。在LoadSprite的下面一行中,您尝试访问索引为-1的hitSprites数组(hitSprites[-1](,当然这是越界的。

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

您需要钳制spriteIndex,使其不小于0(第一个数组索引(,并超过hitSprites。长度减少1(最后一个数组指数(。

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

提示:不要在更新中调用太多GetComponent。。在唤醒状态下预取所有组件以备日后使用。

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

我不知道你在做什么,但你会收到错误,因为你正在访问>=hitSprites长度的索引。

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

您的新LoadSprite功能应该是:

void LoadSprite()
{
    int spriteIndex = 0;
    //Don't decrement if timesHit  is 0
    if (timesHit > 0)
    {
        spriteIndex = timesHit - 1;
    }
    else
    {
        spriteIndex = timesHit;
    }
    //Return/Exit function if spriteIndex  is equals or more than hitSprites length
    if (spriteIndex > hitSprites.Length - 1)
    {
        return; 
    }
    this.GetComponent<SpriteRenderer>().sprite = hitSprites[spriteIndex];
}

@程序员@Dan Cook@user2867426拳头,我要感谢大家的回答,我从你们身上学到了很多,非常感谢!!嗯,我有点错误地纠正了我的错误,哈哈。当我优化我的代码时,我注意到我在update((中使用了这个if条件,而我可以直接将它用于OnCollisionEnter2D((:

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

不知怎么解决了我不知道怎么解决的问题,也许问题是它被称为每一帧,但现在不是了!如果你们能向我解释一下从update((转移if条件是如何解决问题的,我真的很感激^^再次感谢大家。