Доброе утро Разработчики Я знаю, что этот вопрос задан раньше, но я не нашел решения своей проблемы в эти ответы, сначала я хотел бы сказать вам, что я всего лишь новичок в единстве: p, ну вот моя проблема: я строю игру из кирпичного выключателя, что я пытаюсь сделать, - это изменить спрайт кирпич, когда он получает удар по мячу, чтобы сделать это, я использую этот скрипт:«Unity3D» Index Out Of Range Exception: Индекс массива выходит за пределы допустимого диапазона (пытается сменить спрайт при попадании)
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)
, и я получаю его каждый кадр !, s o слишком сильно замедляет игровую сцену, и я больше не могу тестировать свою игру. Не могли бы вы рассказать мне, что я сделал неправильно и как это исправить? Это может помочь, если вы направляете меня на курс, чтобы узнать больше о моей ошибке и больше не делать этого.
lol принимает ответ, а затем не принимает его ... Чтобы ответить на ваш вопрос, это потому, что вызов его из 'OnCollisionEnter2D' будет вызываться только тогда, когда на самом деле есть хит. Но когда вы переводите код в функцию «Update», его вызывают 60 раз в секунду или каждый кадр независимо от того, есть ли у него удар или нет. Счастливое кодирование! – Programmer
@ Программист aaah ok я понимаю лучше сейчас, поэтому произошло то, что до того, как были сделаны какие-то хиты, время было = 0; и поскольку spriteIndex = timesHit - 1; то spriteIndex получал -1, и это то, что вызывало проблему !! , так что еще один способ исправить это, добавив «if (timeshit <1) return;» в начало метода LoadSprite() это предотвратит получение spriteIndex значения -1: D –
Да, это правильно. Вы также должны убедиться, что длина не больше или равна длине 'hitSprites'. 'hitSprites.Length - 1'. Я объяснил это в своем ответе. – Programmer