コード例 #1
0
        // create a terrain map of ALL terrains, by using only their placement to fit them to a grid
        // the position and size of originTerrain defines the grid alignment and origin.  if NULL, we use the first active terrain
        static public TerrainMap CreateFromPlacement(Vector2 gridOrigin, Vector2 gridSize, System.Predicate <Terrain> filter = null, bool fullValidation = true)
        {
            if ((Terrain.activeTerrains == null) || (Terrain.activeTerrains.Length == 0))
            {
                return(null);
            }

            TerrainMap terrainMap = new TerrainMap();

            float gridScaleX = 1.0f / gridSize.x;
            float gridScaleZ = 1.0f / gridSize.y;

            // iterate all active terrains
            foreach (Terrain terrain in Terrain.activeTerrains)
            {
                // some integration tests just create a terrain component without terrain data
                if (terrain.terrainData == null)
                {
                    continue;
                }

                if ((filter == null) || filter(terrain))
                {
                    // convert position to a grid index, with proper rounding
                    Vector3 pos   = terrain.transform.position;
                    int     tileX = Mathf.RoundToInt((pos.x - gridOrigin.x) * gridScaleX);
                    int     tileZ = Mathf.RoundToInt((pos.z - gridOrigin.y) * gridScaleZ);
                    // attempt to add the terrain at that grid position
                    terrainMap.TryToAddTerrain(tileX, tileZ, terrain);
                }
            }

            // run validation to check alignment status
            if (fullValidation)
            {
                terrainMap.Validate();
            }

            return((terrainMap.m_terrainTiles.Count > 0) ? terrainMap : null);
        }
コード例 #2
0
        static public TerrainMap CreateFromConnectedNeighbors(Terrain originTerrain, System.Predicate <Terrain> filter = null, bool fullValidation = true)
        {
            if (originTerrain == null)
            {
                return(null);
            }

            if (originTerrain.terrainData == null)
            {
                return(null);
            }

            TerrainMap terrainMap = new TerrainMap();

            Queue <QueueElement> todoQueue = new Queue <QueueElement>();

            todoQueue.Enqueue(new QueueElement(0, 0, originTerrain));

            int maxTerrains = Terrain.activeTerrains.Length;

            while (todoQueue.Count > 0)
            {
                QueueElement cur = todoQueue.Dequeue();
                if ((filter == null) || filter(cur.terrain))
                {
                    if (terrainMap.TryToAddTerrain(cur.tileX, cur.tileZ, cur.terrain))
                    {
                        // sanity check to stop bad neighbors causing infinite iteration
                        if (terrainMap.m_terrainTiles.Count > maxTerrains)
                        {
                            break;
                        }

                        if (cur.terrain.leftNeighbor != null)
                        {
                            todoQueue.Enqueue(new QueueElement(cur.tileX - 1, cur.tileZ, cur.terrain.leftNeighbor));
                        }
                        if (cur.terrain.bottomNeighbor != null)
                        {
                            todoQueue.Enqueue(new QueueElement(cur.tileX, cur.tileZ - 1, cur.terrain.bottomNeighbor));
                        }
                        if (cur.terrain.rightNeighbor != null)
                        {
                            todoQueue.Enqueue(new QueueElement(cur.tileX + 1, cur.tileZ, cur.terrain.rightNeighbor));
                        }
                        if (cur.terrain.topNeighbor != null)
                        {
                            todoQueue.Enqueue(new QueueElement(cur.tileX, cur.tileZ + 1, cur.terrain.topNeighbor));
                        }
                    }
                }
            }

            // run validation to check alignment status
            if (fullValidation)
            {
                terrainMap.Validate();
            }

            return(terrainMap);
        }