无法在脚本生成的多个位置实例化一副纸牌

can't intantiate an deck of cards on multiple locations generated from the script

我有一个脚本,我必须在脚本生成的 100 个不同位置实例化 100 张卡片,即 10 行和 10 列。所以当我 运行 玩它时,它会在 100 个不同的位置中的每个位置生成 100 张不同的卡片,这意味着它会生成 10,000 张卡片。我需要做的就是在 100 个位置上生成 100 张卡片。我是编程新手,所以我相信它对你们所有的专业人士来说都是愚蠢的,但任何帮助都是好的,我的脚本如下:

'''

private void GenerateGrid()

{
    {

        for (int row = 0; row < rows; row++) {
            for (int col = 0; col < cols; col++) {
                float posX = col * tilesize;
                float posY = row * tilesize;
                {
                    float xoffset = -4f;
                    float yoffset = 4f;

                    transform.position = new Vector2 (posX + xoffset, posY + yoffset);


                   foreach (string card in deck) {


                        GameObject newCard = (GameObject)Instantiate (cardPrefab, transform.position, (Quaternion.identity));

                        //GameObject newCard = (GameObject)Instantiate (cardPrefab);


                        newCard.name = card;
                    }


                }

            }

        }
    }

想一想。你有 10 行,10 列,100 张卡片。你嵌套了 3 个 for 循环,所以你最终调用 GameObject newCard = (GameObject)Instantiate (cardPrefab, transform.position, (Quaternion.identity)); 10*10*100 = 10 000 次。

您实际上不需要遍历卡片。您需要遍历行和列(您已经在做),而不是遍历卡片,您只想将 one 卡片添加到那个地方,每次 selecting下一张牌。所以你需要有计数器变量来计算下一张要 select 的卡片。

    int counter = 0;
    for (int row = 0; row < rows; row++) {
        for (int col = 0; col < cols; col++) {
            float posX = col * tilesize;
            float posY = row * tilesize;
            {
                float xoffset = -4f;
                float yoffset = 4f;
                transform.position = new Vector2 (posX + xoffset, posY + yoffset);

                GameObject newCard = (GameObject)Instantiate (cardPrefab, transform.position, (Quaternion.identity));
                // Select card from deck
                newCard.name = deck[counter];
                // Increase counter by 1
                counter++;

            }
        }
    }

现在,如果您想成为一名出色的程序员,您可能会意识到前两个 for 循环可以充当您的计数器,因此您不需要那个变量。本质上,您有 2D 网格(行 x 列),您需要将其映射到 1D 字符串数组。 Here is another post that explains how to work it out

您现在可以将我上面的代码重写为:

    for (int row = 0; row < rows; row++) {
        for (int col = 0; col < cols; col++) {
            float posX = col * tilesize;
            float posY = row * tilesize;
            {
                float xoffset = -4f;
                float yoffset = 4f;
                transform.position = new Vector2 (posX + xoffset, posY + yoffset);

                GameObject newCard = (GameObject)Instantiate (cardPrefab, transform.position, (Quaternion.identity));
                // Select card from deck
                // Multiplied by "10" because that's width of your row
                newCard.name = deck[row * 10 + col];

            }
        }
    }