早上好開發人員我知道這個問題以前曾被問過,但我沒有找到解決方案來解決我的問題這些答案,首先我想告訴你,我只是一個團結初學者:嗯,這裏是我的問題:我正在構建一個磚頭破碎機遊戲,我想要做的是改變精靈當它被用球砸磚頭,這樣做,我使用這個腳本:「Unity3D」索引超出範圍例外:數組索引超出範圍(嘗試更改精靈命中時)
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)
,我得到它的每一幀!小號o它太慢了遊戲場景,我無法再測試我的遊戲了。你能告訴我我做錯了什麼以及如何解決它嗎?如果你指導我學習更多關於我的錯誤的課程並且不會再次這樣做,這可能會有所幫助。
lol接受答案然後取消接受....要回答你的問題,那是因爲從'OnCollisionEnter2D'調用它只會在實際存在命中時調用它。但是當你將代碼移動到'Update'函數時,無論是否存在命中,每秒或每幀都會被調用60次。快樂的編碼! – Programmer
@Programmer aaah好吧我現在明白了,所以發生的事情是,在任何命中之前,timesHit = 0;並且因爲spriteIndex = timesHit - 1;然後spriteIndex得到-1,這就是導致問題的原因! 所以解決它的另一種方法是在LoadSprite()方法 的頂部添加「if(timeshit <1)return;」,這將防止spriteIndex獲得值-1:D –
是的,這是正確的。您還應該確保長度不超過或等於'hitSprites'的長度。 'hitSprites.Length - 1'。我在我的回答中解釋了這一點。 – Programmer