首页 > 解决方案 > 无法在脚本生成的多个位置上实例化一副纸牌

问题描述

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

'''

私人无效生成网格()

{
    {

        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;
                    }


                }

            }

        }
    }

标签: c#unity3dscriptinginstantiation

解决方案


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

实际上,您不需要遍历卡片。您需要遍历行和列(您已经在执行此操作),但不是遍历卡片,而是只想将一张卡片添加到该位置,每次选择下一张卡片。所以你需要有一个计数器变量来计算接下来要选择哪张卡。

    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 字符串数组。这是另一篇文章,解释了如何解决

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

    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];

            }
        }
    }

推荐阅读