我有一个脚本,我必须在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;
}
}
}
}
}
考虑一下吧。你有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];
}
}
}