Exemplo n.º 1
0
        public override void OnSceneGUI(Terrain terrain, IOnSceneGUI editContext)
        {
            if ((Event.current.type == EventType.MouseUp || Event.current.type == EventType.MouseDown) &&
                (Event.current.button == 2 || Event.current.alt) ||
                terrain.terrainData == null)
            {
                return;
            }

            Quaternion rot = new Quaternion();

            rot.eulerAngles = new Vector3(90, 00, 0);

            Handles.color = new Color(0.9f, 1.0f, 0.8f, 1.0f);
            Vector3 size = terrain.terrainData.size;

            TerrainMap mapGroup = TerrainMap.CreateFromPlacement(terrain);

            if (mapGroup == null)
            {
                return;
            }

            foreach (TerrainTileCoord coord in mapGroup.terrainTiles.Keys)
            {
                int x = coord.tileX;
                int y = coord.tileZ;

                Terrain t = mapGroup.GetTerrain(x, y);

                if (t == null)
                {
                    continue;
                }

                Terrain left   = mapGroup.GetTerrain(x - 1, y);
                Terrain right  = mapGroup.GetTerrain(x + 1, y);
                Terrain top    = mapGroup.GetTerrain(x, y + 1);
                Terrain bottom = mapGroup.GetTerrain(x, y - 1);

                Vector3 pos = t.transform.position + 0.5f * new Vector3(size.x, 0, size.z);

                if ((bottom == null) && Handles.Button(pos + new Vector3(0, 0, -size.z), rot, 0.5f * size.x, 0.5f * size.x, Handles.RectangleHandleCapWorldSpace))
                {
                    CreateNeighbor(terrain, t.transform.position + Vector3.back * size.z);
                }
                if ((top == null) && Handles.Button(pos + new Vector3(0, 0, size.z), rot, 0.5f * size.x, 0.5f * size.x, Handles.RectangleHandleCapWorldSpace))
                {
                    CreateNeighbor(terrain, t.transform.position + Vector3.forward * size.z);
                }
                if ((right == null) && Handles.Button(pos + new Vector3(size.x, 0, 0), rot, 0.5f * size.x, 0.5f * size.x, Handles.RectangleHandleCapWorldSpace))
                {
                    CreateNeighbor(terrain, t.transform.position + Vector3.right * size.x);
                }
                if ((left == null) && Handles.Button(pos + new Vector3(-size.x, 0, 0), rot, 0.5f * size.x, 0.5f * size.x, Handles.RectangleHandleCapWorldSpace))
                {
                    CreateNeighbor(terrain, t.transform.position + Vector3.left * size.x);
                }
            }
        }
        internal static TerrainGroups CollectTerrains(bool onlyAutoConnectedTerrains = true)
        {
            if (!HasValidTerrains())
            {
                return(null);
            }

            // Collect by groups
            TerrainGroups TerrainGroups = new TerrainGroups();

            foreach (Terrain t in Terrain.activeTerrains)
            {
                if (onlyAutoConnectedTerrains && !t.allowAutoConnect)
                {
                    continue;
                }

                if (!TerrainGroups.ContainsKey(t.groupingID))
                {
                    TerrainMap map = TerrainMap.CreateFromPlacement(t, (x => (x.groupingID == t.groupingID) && !(onlyAutoConnectedTerrains && !x.allowAutoConnect)));
                    if (map != null)
                    {
                        TerrainGroups.Add(t.groupingID, map);
                    }
                }
            }
            return((TerrainGroups.Count != 0) ? TerrainGroups : null);
        }
        public static Terrain[] GetTerrainsInGroup(Terrain terrain)
        {
            TerrainMap terrainMap = TerrainMap.CreateFromPlacement(terrain, null, false);

            Terrain[] terrainGroup = terrainMap.terrainTiles.Select(o => o.Value).ToArray();

            return(terrainGroup);
        }