示例#1
0
    void DisplayObject(TerrainObjectData tod, int index, out bool isDeleted)
    {
        GUILayout.BeginHorizontal("box");

        GUILayout.BeginVertical();
        tod.obj                 = EditorGUILayout.ObjectField("Object", tod.obj, typeof(GameObject), false) as GameObject;
        tod.spawnRadius         = EditorGUILayout.FloatField("Spawn radius", tod.spawnRadius);
        tod.spawnIterationCount = EditorGUILayout.IntField("Spawn iteration", tod.spawnIterationCount);
        tod.minSpawnHeight      = EditorGUILayout.FloatField("Min height", tod.minSpawnHeight);
        tod.maxSpawnHeight      = EditorGUILayout.FloatField("Max height", tod.maxSpawnHeight);
        tod.spawnHeightOffset   = EditorGUILayout.FloatField("Height offset", tod.spawnHeightOffset);
        tod.maxSpawnSlopeValue  = EditorGUILayout.Slider("Max slope", tod.maxSpawnSlopeValue, 0f, 0.1f);
        tod.scaleFactor         = EditorGUILayout.Slider("Scale factor", tod.scaleFactor, 0f, 0.99f);
        GUILayout.EndVertical();

        if (GUILayout.Button("Delete object", GUILayout.Height(40)))
        {
            serializableObject.objects.RemoveAt(index);
            isDeleted = true;
        }
        else
        {
            isDeleted = false;
        }
        GUILayout.EndHorizontal();
    }
    public static List <TerrainObjectData> Generate(TileData tile, TerrainSettings settings, GameObject[] variants)
    {
        List <TerrainObjectData> mountains = new List <TerrainObjectData>();

        for (int i = 0; i < settings.maxMountainsPerTile; i++)
        {
            Vector3 randomPosition = new Vector3(Random.Range(0, settings.tileSize), 0, Random.Range(0, settings.tileSize));
            if (tile.type.IsWaterTile())
            {
                randomPosition.y = settings.seaMountainLevel;
            }
            int               randIndex      = Random.Range(0, variants.Length);
            Vector3           randomRotation = new Vector3(0, Random.Range(0, 360), 0);
            TerrainObjectData newMountain    = new TerrainObjectData(randIndex, randomPosition + tile.Position, randomRotation, Vector3.one * Random.Range(settings.sizeVariationLower, settings.sizeVariationUpper));

            mountains.Add(newMountain);
        }
        return(mountains);
    }
示例#3
0
    void SpawnObjects(List <Vector2> points, TerrainObjectData obj, float[,] heightMap)
    {
        float cellSize = 1f / LOD;

        foreach (Vector2 point in points)
        {
            PointData pointData    = CalculatePointData(heightMap, cellSize, point);
            bool      spawnAllowed = true;
            spawnAllowed &= pointData.height >= obj.minSpawnHeight && pointData.height <= obj.maxSpawnHeight;
            spawnAllowed &= Mathf.Abs(pointData.gradient.x) <= obj.maxSpawnSlopeValue && Mathf.Abs(pointData.gradient.y) <= obj.maxSpawnSlopeValue;
            if (spawnAllowed)
            {
                Vector3    position        = new Vector3(point.x, mapGenerator.GetHeightAt(pointData.height), point.y);
                GameObject gameObj         = Instantiate(obj.obj, position, Quaternion.Euler(0f, (float)prng.NextDouble(), 0f));
                float      scaleMultiplier = (float)prng.NextDouble() * (obj.scaleFactor * 2) - obj.scaleFactor;
                gameObj.transform.localScale += Vector3.one * scaleMultiplier;
                SetParent(gameObj);
            }
        }
    }
    public void ConstructTerrain()
    {
        for (int i = 0; i < terrainData.tiles.Count; i++)
        {
            TileData     tile = terrainData.tiles[i];
            GameObject[] variants;
            switch (tile.type)
            {
            case TileType.CoastInnerCorner: variants = tileSet.coastalInnerCorner; break;

            case TileType.CoastOuterCorner: variants = tileSet.coastalOuterCorner; break;

            case TileType.CoastStraight: variants = tileSet.coastalStraight; break;

            case TileType.Forest:
            case TileType.Plains: variants = tileSet.plainsTiles; break;

            case TileType.Mountain: variants = tileSet.plainsTiles; break;

            case TileType.Taiga:
            case TileType.Tundra: variants = tileSet.snowTiles; break;

            case TileType.Desert: variants = tileSet.desertTiles; break;

            case TileType.RainForest: variants = tileSet.rainForestTiles; break;

            case TileType.OceanFloor: variants = tileSet.oceanFloorTiles; break;

            case TileType.RiverMouth: variants = tileSet.riverMouth; break;

            case TileType.RiverStraight: variants = tileSet.riverStraight; break;

            case TileType.RiverBendRight: variants = tileSet.riverCornerRight; break;

            case TileType.RiverBendLeft: variants = tileSet.riverCornerLeft; break;

            case TileType.RiverEnd: variants = tileSet.riverEnd; break;

            default: variants = tileSet.plainsTiles; break;
            }
            GameObject tileGameObject = Instantiate(variants[Random.Range(0, variants.Length)], tile.Position, Quaternion.Euler(tile.Rotation), transform);
            for (int j = 0; j < tile.mountains.Count; j++)
            {
                TerrainObjectData mountain = tile.mountains[j];
                Instantiate(mountainSet.mountains[mountain.typeIndex], mountain.Position, Quaternion.Euler(mountain.Rotation), tileGameObject.transform);
            }
            for (int j = 0; j < tile.boulders.Count; j++)
            {
                TerrainObjectData boulder = tile.boulders[j];
                Instantiate(mountainSet.boulders[boulder.typeIndex], boulder.Position, Quaternion.Euler(boulder.Rotation), tileGameObject.transform);
            }
            // set to be covered in snow if below freezing
            if (tile.temperatureValue < settings.freezingTemperature)
            {
                MeshRenderer[] meshRends = tileGameObject.GetComponentsInChildren <MeshRenderer>();
                for (int j = 0; j < meshRends.Length; j++)
                {
                    meshRends[j].sharedMaterial = snowMaterial;
                }
            }
            if (tile.moistureValue < settings.sandMoistureLevel && tile.temperatureValue >= .7f)
            {
                MeshRenderer[] meshRends = tileGameObject.GetComponentsInChildren <MeshRenderer>();
                for (int j = 0; j < meshRends.Length; j++)
                {
                    meshRends[j].sharedMaterial = sandMaterial;
                }
            }
        }
        GenerateOcean();
    }