[英]Strange behavior adding objects to Array Unity3d C#
在將對象添加到GameObjects數組時,我看到了一些奇怪的行為。 這是我的sudo代碼:
public class GameController : MonoBehaviour {
public GameObject[] MyArray;
void Awake() {
Application.runInBackground = true;
MyArray= new GameObject[144];
}
//some code that calls myFunction
public IEnumerator myFunction(float time)
{
int counter = 0;
GameObject card= AnotherArrayOfGameObjects[0];
for (int j = 0; j < 144; j++)
{
card.name = "BLANK_" + (j+1);
Instantiate(card, cardVector, Quaternion.Euler(0, rotateAdujust, 180));
MyArray[counter] = card;
yield return new WaitForSeconds(time);
counter++;
}
}
}
這個功能很好用。 它創建我的對象並實例化它。 但是,當它將對象“card”添加到數組MyArray時,它不會正確添加它。 即,因為這是一個循環,0-143,我希望數組看起來像這樣:
MyArray[0] = "BLANK_1"
MyArray[1] = "BLANK_2"
....
MyArray[143] = "BLANK_144"
相反,它看起來像這樣:
MyArray[0] = "BLANK_144"
MyArray[1] = "BLANK_144"
....
MyArray[143] = "BLANK_144"
順便說一句,我可以看到這一切,因為我的代碼中的MyArray是一個公共變量,所以我可以在Unity的Inspector中看到它。 如果我調試,我可以看到每次迭代覆蓋前一次。 所以,在循環的第一次迭代中,我得到:
MyArray[0] = "BLANK_1"
然后在循環的第二次迭代中,我得到:
MyArray[0] = "BLANK_2"
MyArray[1] = "BLANK_2"
在第三個:
MyArray[0] = "BLANK_3"
MyArray[1] = "BLANK_3"
MyArray[2] = "BLANK_3"
直到它完成完整循環並且數組中的所有項目都說“BLANK_144”
任何人都可以解釋為什么會這樣嗎?
您在每次迭代時將相同的card
對象添加到數組。 並且您在每次迭代時更改此對象的名稱。 因此,您最終會得到數組,其中所有項都指向同一個卡實例。 並且該卡實例具有您已分配的最新名稱(在最后一次迭代中):
MyArray[counter] = card;
記住 - Instantiate
方法返回克隆對象,但它不會更改您正在克隆的對象。 因此,您在每次迭代時實例化新克隆,但不要將其保存在任何位置。
您應該添加到要實例化的陣列卡克隆:
GameObject card = AnotherArrayOfGameObjects[0];
for (int j = 0; j < 144; j++)
{
var cardClone = Instantiate(card, cardVector, Quaternion.Euler(0, rotateAdujust, 180));
cardClone.name = "BLANK_" + (j+1);
MyArray[j] = cardClone;
yield return new WaitForSeconds(time);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.