【问题标题】:How To Fix 'Array index is out of range error' In Unity3D如何修复 Unity3D 中的“数组索引超出范围错误”
【发布时间】:2015-08-31 05:33:17
【问题描述】:

我一直在关注 Udemy 上的通过制作游戏(在 Unity 4.6.3 中)学习编程课程的 Block Breaker 部分。我决定在比赛中走一条稍微不同的道路,挑战自己。但是我有一些问题。所以这个想法是,当一个球击中屏幕底部的对撞机(名为 lostCollider)时,玩家将失去 1 条生命(其中有 5 条生命)。从目前我的游戏的屏幕截图中可以看出,有 5 颗心,每颗都附有一个精灵。我想要的是让球击中 lostCollider 并根据 lossCollider 被击中的次数改变心的精灵。但是我不断收到此错误消息:

代码如下:

using UnityEngine;
using System.Collections;
using UnityEngine.UI;

public class LoseCollider : MonoBehaviour {

private LevelManager levelManager;

public Sprite[] lives;

public GameObject lives1;
public GameObject lives2;
public GameObject lives3;
public GameObject lives4;
public GameObject lives5;

private int amountHit;
private int maxHit = 5;


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

void OnTriggerEnter2D (Collider2D trigger) {
    print ("Trigger");
}

void OnCollisionEnter2D (Collision2D collision) {
    LoadSprites ();
    print ("Collider");
    amountHit++;
    print (amountHit);
    if(amountHit == maxHit){
        levelManager.LoadLevel("Lose");
    }
}

void LoadSprites () {
    int spriteIndex = 1;

    lives1.GetComponent<SpriteRenderer>().sprite = lives[spriteIndex];

    if(amountHit >= 1){
        print ("Hit 1");
        lives1.GetComponent<SpriteRenderer>().sprite = lives[spriteIndex];
    } else if(amountHit >= 2){
        print ("Hit 2");
        lives2.GetComponent<SpriteRenderer>().sprite = lives[spriteIndex];
    } else if(amountHit >= 3){
        print ("Hit 3");
        lives3.GetComponent<SpriteRenderer>().sprite = lives[spriteIndex];
    } else if(amountHit >= 4){
        print ("Hit 4");
        lives4.GetComponent<SpriteRenderer>().sprite = lives[spriteIndex];
    } else if(amountHit >= 5){
        print ("Hit 5");
        lives5.GetComponent<SpriteRenderer>().sprite = lives[spriteIndex];
    }
}

还有游戏截图:

【问题讨论】:

  • 没有任何代码(请将代码放在这里而不是别处),唯一的答案是 - 不要尝试访问 >= 到数组大小的索引。

标签: c# unity3d


【解决方案1】:

来自您的代码:

int spriteIndex = 1;
lives1.GetComponent<SpriteRenderer>().sprite = lives[spriteIndex];

您是否在lives 数组中填充了一些东西?尝试访问索引 >= 数组大小的数组会导致像您这样的错误。如果不知道您从编辑器中用什么填充了 lives 数组,很难说,但我会先将 spriteIndex 设置为 0。

【讨论】:

  • 感谢您的快速回复!我尝试将 spriteIndex 设置为 0,但结果仍然相同。我不确定你所说的生活充满了什么。最后,您是否建议更改 if 语句的操作?
  • 再一次,你给lives 填了些什么吗?您是否为该数组设置了长度并将图像存储到其中?如果是这样,您可以发布执行此操作的代码吗?
  • 好的,我现在知道你的意思了。 Lives 中充满了一个名为 Heart_1 的精灵。
  • LoadSprites 中运行的第一件事就是运行Debug.Log(lives.Length);,确保生活充满了一些东西。将 spriteIndex 更改为 0 时,您是否得到完全相同的错误?确保错误中的数字相同,它表明错误发生在代码文件的哪一行。
  • 是的,就是这样!结合使用游戏对象而不是 UI 元素(应该知道这一点!)并将其设置为 0 就可以了。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-30
  • 1970-01-01
  • 2021-09-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多