如何用立方体创建自定义形状?(使用 3D 数组)

How to create a custom shape out of cubes? (using a 3d array)

提问人:nthh 提问时间:7/2/2023 最后编辑:nthh 更新时间:7/3/2023 访问量:57

问:

所以我想创建一个具有较小立方体的立方体,但它看起来更像一个球体。就像由立方体组成的游戏一样,比如 Minecraft。我想出了这样的形状。“球形立方体”

在此之前,我只创建了一个普通的立方体,有 3 个“for”循环,逐行。(它只是一个带有“1”和“0”值的普通 3D int 数组)因此,如果我以同样的方式做我的“球体”,就会有很多元素需要跳过,而且由于立方体是 13x13,它的 169 行......这么多代码 - 看起来一团糟。有什么不同的方法可以做到这一点吗?

C# 循环 Unity-Game-Engine 多维数组 形状

评论

0赞 nthh 7/2/2023
所以我的问题太笼统了?我需要提供代码吗?对不起,这是我的第一个,我无法真正正确地描述我的问题。我只是想知道有经验的程序员是如何处理这些形状的。我没有得到“代码审查”部分,这是什么?感谢您的回复,非常感谢!
1赞 pacmaninbw 7/2/2023
@BugFinder 如果没有代码,这个问题在代码审查中是题外话。
1赞 BugFinder 7/2/2023
@pacmaninbw我的意思是 - 当正确询问时:p不好意思。

答:

1赞 nthh 7/3/2023 #1

我成功了!这是我的代码...我仍然不明白一些事情...... 当我改变一切时,一切都开始工作了 ||运算符到 |

请告诉我是否可以使此代码更好。我是Unity和编程的新手,所以每一点信息都受到高度赞赏!

private void DestroyBlockBrush6(Vector3Int blockPos)
   {
       int brushSize = 13;
       bool killBlock = false;
       int indent = -1;

       int currBlockX = blockPos.x - brushSize / 2;
       int currBlockY = blockPos.y - brushSize / 2;
       int currBlockZ = blockPos.z - brushSize / 2;

       for (int z = 0; z < brushSize; z++, currBlockZ++)
       {
           for (int y = 0; y < brushSize; y++, currBlockY++)
           {
               indent = SetIndent(y, z);

               for (int x = 0; x < brushSize; x++, currBlockX++)
               {
                   if (indent >= 0)
                   {
                       if ((x >= indent) && (x < brushSize - indent))
                       {
                           killBlock = true;
                       }
                       else
                       {
                           killBlock = false;
                       }
                   }

                   if ((currBlockX >= 0 && currBlockX < ChunkWidth) &&
                       (currBlockY >= 0 && currBlockY < ChunkHeight) &&
                       (currBlockZ >= 0 && currBlockZ < ChunkLength) && killBlock)
                   {
                       Blocks[currBlockX, currBlockY, currBlockZ] = 0;
                   }
               }
               currBlockX -= brushSize;
           }
           currBlockY -= brushSize;
       }

       //Blocks[7, 0, 0] = 1; 
       // IDONT KNOW WHAT CAN I DO ABOUT THIS BUG :)

       static int SetIndent(int y, int z)
       {
           if ((z == 0 | z == 12) && (y > 2 && y < 10)) return 3;

           if ((z == 1 | z == 11) && (y == 2 | y == 10)) return 3;
           if ((z == 1 | z == 11) && (y > 2 && y < 10)) return 2;

           if ((z == 2 | z == 10) && (y == 1 | y == 11)) return 3;
           if ((z == 2 | z == 10) && (y == 2 | y == 10)) return 2;
           if ((z == 2 | z == 10) && (y > 2 && y < 10)) return 1;

           if ((z >= 3 && z <= 9) && (y == 0 | y == 12)) return 3;
           if ((z >= 3 && z <= 9) && (y == 2 | y == 10)) return 1;
           if ((z >= 3 && z <= 9) && (y == 1 | y == 11)) return 2;
           if ((z >= 3 && z <= 9) && (y > 2 && y < 10)) return 0;

           return -1;
       }
**strong text**
       RegenerateMesh();
   }