c# - 将对象添加到 Array Unity3d C# 的奇怪行为

标签 c# unity3d

在将对象添加到游戏对象数组时,我看到了一些奇怪的行为。这是我的 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 在我的代码中是一个公共(public)变量,所以我可以在 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);
}

关于c# - 将对象添加到 Array Unity3d C# 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42964763/

相关文章:

c# - foreach循环Unity3D C#中的协程

c# - 如何在 Entity Framework 5 中正确触发集合的延迟加载?

c# if or语句指定主题

c# - 将小数部分附加到整数

c# - 更新停止在特定情况下调用函数。请详细阅读

c# - 统一: Knockback my player

c# - 在 C# 中声明固定大小数组的列表

c# - 以一种形式处理 2 个提交按钮

c# - 在 Unity 中读取二维码

c# - 是否可以使用枚举动态获取静态类?