Unity3d - 在集合中保存大量Vector3的最佳方法?

时间:2014-03-10 22:15:25

标签: performance loops grid unity3d

我试图在任何类型的集合中保存块位置。例如,如果我有一个16 * 16块的网格,我需要保存256个块位置。我可以直接使用数组或列表吗?这里没问题。

但是当我有一个网格网格时,例如10x10网格网格。突然间我需要保存10x10x256块。我目前在每个网格中保存块,因此每个网格都会跟踪它自己的块。这里也没问题(还)。

问题实际上是我需要遍历所有这些网格以检查网格是否具有辅助网格。这导致了大量的循环时间。

我想知道是否有某种方法可以减少这种情况,或者做得更好 我正在考虑使用这些块的位置作为集合中的索引,但是例如使用多维数组会产生很多超出范围的错误,所以不知何故我不能使用它。

2 个答案:

答案 0 :(得分:1)

如果我理解正确你可能需要这个 我将每个GameObject存储在Gameobject数组中 你可能不会在这里得到例外

    GameObject[,] ArrayOfGameObjects = new GameObject[10, 10];       
    public void spawnGrid ()
                {
                    for (int y = 0; y < 10; y++) {
                        for (int x = 0; x <10; x++) {

                        ArrayOfGameObjects[x,y] = Instantiate (YourPrefabGameObject, new Vector3 (x, y, 0),Quaternion.identity)as GameObject;   

                        }
                    }
                }

    public CheckAdjOf (GameObject gameObj)
            {

                if (gameObj == null)
                {
                     //Do your stuff if its null
                     //for example break, return 
                    }

                int x = (int)gameObj.transform.position.x;
                int y = (int)gameObj.transform.position.y;

                GameObject Left,Right,Up,Down;      

                if (x < mArray.GetUpperBound (0))       
                Right = ArrayOfGameObjects [x + 1, y] == 0);

                if (x > 0)  
                Left = ArrayOfGameObjects [x - 1, y] == 0);


                if (y < mArray.GetUpperBound (0))
                Up = ArrayOfGameObjects [x, y + 1] == 0);

                if (y > 0)
                Down = ArrayOfGameObjects [x, y - 1] == 0);

                // you can also find diagonal GameObjects 
                // do your stuff after you getting all adjunctive grid/block 

            }

答案 1 :(得分:1)

我假设您要检查网格的一部分是否在另一个网格中?如果没有,请忽略;)

如果是这样,您可以通过为每个网格创建bounds来优化事物。每个网格都可以有一个对撞机,只有在两个网格之间发生碰撞时才能对各个块进行检查。

这应该通过远程网格消除不必要的循环。在添加新块时,您应该能够使用Bounds.Encapsulate来增加网格的边界。

第h。