不能在脚本生成的多个位置上实例化一副牌。

问题描述 投票:0回答:1

我有一个脚本,我必须在100个不同的位置上实例化100张牌,这是由脚本生成的,即10行和10列.所以当我运行播放,它产生100个不同的卡在100个不同的位置上,这意味着它产生10,000张牌.所有我需要做的是生成100张牌在100个位置上。我是新的 bie 编程,所以我肯定其为你们所有的专业人员的一个愚蠢的,但任何援助是好我的脚本是如下。

'''

私有空闲的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;
                    }


                }

            }

        }
    }
c# unity3d scripting instantiation
1个回答
0
投票

考虑一下吧。你有10行,10列,100张牌。你有3个for循环嵌套,所以你最终调用了 GameObject newCard = (GameObject)Instantiate (cardPrefab, transform.position, (Quaternion.identity)); 10*10*100=10000次。

其实你不需要在卡片上循环。你需要在行和列中循环(你已经在做了),但你不需要在卡片中循环,你只需要添加 一个 卡到那个地方,每次选择下一张卡。所以你需要有一个计数器变量来计算下一张牌的数量。

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

            }
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.