我正在開發一個磚塊游戲克隆,所以我試圖在游戲中添加一個乘球功能。該視頻展示了該功能。
這是我的代碼:
//access to all active balls
Ball[] balls = FindObjectsOfType<Ball>();
//loop for the length of the balls
for (int i = 0; i <= balls.Length; i )
{
if (balls.Length >= 1000)
{
return;
}
else
{
// here I'm trying to fix the issue by checking if the ball exists, so I will call the function if not. return. but console show me same message
if (balls[i] != null)
{
balls[i].CallM3x();
i ;
}
}
}
統一控制臺訊息是:
IndexOutOfRangeException: Index was outside the bounds of the array.
我上面的代碼作業正常,但問題是一些球在 for 回圈結束其作業不到一秒之前就被破壞了。
知道如何避免這種情況嗎?
uj5u.com熱心網友回復:
您的回圈有兩個基本問題:
你回圈到
i <= balls.Length哪個總是a[10]會拋出一個錯誤(長度為 10 的陣列中沒有)。您在
i回圈中再次遞增,這將跳過專案
將回圈條件更改為i < balls.Length并洗掉i 回圈內。
此外,您不需要每次都在回圈if (balls.Length >= 1000) 內檢查 - 您可以在回圈之前檢查(但是超過 10,000 個專案的集合有什么問題?)
問題是一些球在 for 回圈結束其作業不到一秒之前就被破壞了
我不明白這怎么會是個問題。您正在創建一個回圈參考的陣列。即使專案在游戲中被銷毀,物件參考仍然存在于您的陣列中。可能有其他標志告訴您一個物件已被破壞(我不是 Unity 專家),但它們不會更改為null 您的陣列內部。
uj5u.com熱心網友回復:
避免在回圈中重新參考已洗掉物件的問題的一種簡單方法是從 to 倒計時i,balls.Length而0不是從0to倒計時balls.Length。
for (int i = balls.Length - 1; i >= 0; i--)
此外,您可能想再次查看您的 for 回圈:您將上升到<= balls.Length,允許最高索引為= balls.Length。但是,該索引超出了范圍,因為我們從 0 開始計數。我建議使用<而不是<=此處。
uj5u.com熱心網友回復:
Ball[] balls = FindObjectsOfType<Ball>();
for (int i = 0; i < balls.Length; i )
{
if (balls.Length >= 1000)
{
return;
}
else
{
if (balls[i] != null)
{
balls[i].CallM3x();
// i ; <- This is your problem. Remove it.
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/488285.html
上一篇:DjangoRest框架CRUD
下一篇:只移動“z”軸
