在将对象添加到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”
任何人都可以解释为什么会这样吗?
答案 0 :(得分:3)
您在每次迭代时向数组添加相同的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);
}