【问题标题】:Arrayoutofbounds before destroying Unity3D GameObject销毁 Unity3D GameObject 之前的 Arrayoutofbounds
【发布时间】:2019-01-12 05:48:45
【问题描述】:

我预计这个对象会在超过数组的数量后自行销毁,但是,它会抛出一个 ArrayOutOfBounds。我想知道有没有办法解决这个问题。

我也试过了:

if (ObjectSprite[spriteNumber + 1] == null)

我预计这会起作用,但我是开发新手,所以我被困在这里

public class DestroyableObject : MonoBehaviour {

    public GameObject coin;
    public int spriteNumber = 0;
    public Sprite[] ObjectSprite;

    void Update () 
    {
        SpriteUpdate();
    }

    void SpriteUpdate()
    {
        this.GetComponent<SpriteRenderer>().sprite = ObjectSprite[spriteNumber];

        if (spriteNumber > ObjectSprite.Length)
        {
            Instantiate(coin, this.transform.position, Quaternion.identity);
            Destroy(this.gameObject);
        }
    }
}

【问题讨论】:

  • 您能否编辑您的答案并包含您收到的实际错误消息。
  • 仅供参考,您的变量名不应以大写字母开头。只有类名(又名:类型)应该这样命名。变量应始终以小写字母开头,以免意外与类名发生冲突。 public Sprite[] objectSprite;

标签: c# unity3d


【解决方案1】:

您在检查spriteNumber 是否大于数组之前尝试访问数组。您应该首先检查spriteNumber 是否超出范围,然后尝试访问ObjectSprite

void SpriteUpdate()
{
    // if we're within the bounds of the array
    if (spriteNumber < ObjectSprite.Length)
    {
        this.GetComponent<SpriteRenderer>().sprite = ObjectSprite[spriteNumber];
    }
    // if we're outside the bounds of the array
    else
    {
        Instantiate(coin, this.transform.position, Quaternion.identity);
        Destroy(this.gameObject);
    }
}

注意if语句里面的条件被翻转了;只有当spriteNumber 小于数组长度时,它才会执行 if 块内的代码。还提供了一个else 子句,当先前的条件不再成立时(它超出数组的范围),它将实例化硬币并销毁对象。

【讨论】:

  • 它仍然没有意义......如果spriteNumber &gt; ObjectSprite.Length你应该继续......你可能会提醒if (spriteNumber &lt; ObjectSprite.Length)
  • 如果spriteNumber是数组ObjectSprite的索引,不应该小于数组的长度吗?否则会一直越界
  • 我已经更新了解决问题的答案并提供了解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-22
相关资源
最近更新 更多