首页 > 解决方案 > 有没有办法在一段时间后(不是立即)在 for 循环中执行操作?

问题描述

所以我正在制作一个扫描网格和每个正方形的邻居的函数,并更改网格中的某些值(死/活)。我目前的问题是:在完成整个扫描之前对网格的某些部分进行了修改。这意味着扫描结果会出错。这是函数的代码:

 public void GridScan(Vector3 worldposition, int range)
    {
        GetXY(worldposition, out int originx, out int originy);
        for (int x = 0; x < range; x++)
        {
            for (int y = 0; y < range; y++)
            {
                Debug.Log(GetValue(originx + x, originy + y));
                if ((GetValue(originx + x, originy + y)) == 100)
                {
                    if (Neighbours(GetWorldPosition(x, y), 2) < 2)
                    {
                        SetValue(x, y, 0);
                    }
                    if (Neighbours(GetWorldPosition(x, y), 2) > 3)
                    {
                        SetValue(x, y, 0);
                    }
                }

                if ((GetValue(originx + x, originy + y)) == 0)
                {
                    if (Neighbours(GetWorldPosition(x, y), 2) == 3)
                    {
                        SetValue(x, y, 100);
                    }
                }
            }

        }
    }

一点上下文:“GetXY”只是将vector3世界位置转换为图形的坐标。

两个 for 循环从原点扫描整个图形,从 (0,0)-(range,0) 然后 (0,1)-(range,1) 等。

“SetValue”和“GetValue”完全按照他们所说的输入两个坐标。

“邻居” 扫描具有特定值邻居的邻居数量。

"GetWorldPosition" 将 x,y 坐标转换为 "Neighbours" 可以使用的向量 3。

在 for 循环完成后,无论如何要执行“SetValue”吗?我可以创建一个网格的实例吗(如果可以,如何?)?这些方法能解决我的问题吗?这是我的第一个项目,对我来说如此赤裸裸。

标签: c#unity3d

解决方案


只需创建您将要进行的所有更改的列表,并在循环后按顺序完成它们。List<(int x, int y, int funkyNumber)>

注意我不确定这些天你是否可以统一使用 ValueTuples。如果不能,您可以创建自己的结构

例子

var list = new List<(int x, int y, int funkyNumber)>();

GetXY(worldposition, out int originx, out int originy);
for (int x = 0; x < range; x++)
{
   for (int y = 0; y < range; y++)
   {
      Debug.Log(GetValue(originx + x, originy + y));
      if ((GetValue(originx + x, originy + y)) == 100)
      {
         if (Neighbours(GetWorldPosition(x, y), 2) < 2)
            list.Add((x, y, 0));
         if (Neighbours(GetWorldPosition(x, y), 2) > 3)
            list.Add((x, y, 0));
      }

      if ((GetValue(originx + x, originy + y)) == 0)
      {
         if (Neighbours(GetWorldPosition(x, y), 2) == 3)
            list.Add((x, y, 100));
      }
   }
}

foreach (var item in list)
   SetValue(item.x,item.y,item.funkyNumber)

推荐阅读