miepzerino
2023-12-27 318d2ec9f6a64d45ef44ae5dcfa6de04d2e710fe
Assets/Scripts/GenerateTileMap.cs
@@ -1,28 +1,54 @@
using System;
using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.Tilemaps;
using UnityEngine.UIElements;
[Serializable]
public class Ore
{
    public string name;
    /// <summary>
    /// The lower the numer the higher the amount of ores that will spawn
    /// Higher number means less ore
    /// </summary>
    [Tooltip("The lower the numer the higher the amount of ores that will spawn. Higher number means less ore.")]
    [Range(1, 100000)]
    public int weight;
    /// <summary>
    /// The lower the number the more dense the ore will spawn (big clusters
    /// Higher number means little clusters (more spread)
    /// </summary>
    [Tooltip("The lower the number the more dense the ore will spawn (big clusters. Higher number means little clusters (more spread).")]
    [Range(10, 100000)]
    public int clusterWeight;
    public RuleTile tile;
    public int maxSpawnHeight;
    public int minSpawnHeight;
}
public class GenerateTileMap : MonoBehaviour
{
    public int? seed;
    public int width = 256;
    public int height = 256;
    public int maxWidth = 256;
    public int maxHeight = 384;
    public int maxGroundHeight = 256;
    private float scale;
    private float offsetX;
    private float offsetY;
    Tilemap tilemap;
    public RuleTile forestRuleTile;
    public TileBase borderTile;
    public List<Ore> ores;
    //public List<TileBase> tiles;
    private void Awake()
    {
        tilemap = GetComponent<Tilemap>();
#if DEBUG
        //seed = 0123456789;
        seed = 0123456789;
#endif
        if (seed == null)
        {
@@ -59,19 +85,21 @@
    public IEnumerator GenerateTiles(Action finishedCallback, List<Vector3Int> destroyedTiles)
    {
        for (int x = 0; x < width; x++)
        // generate ground
        for (int x = 1; x < maxWidth; x++)
        {
            for (int y = 0; y < height; y++)
            for (int y = 1; y < maxGroundHeight; y++)
            {
                float xPerlin = ((float)x / width) * scale + offsetX;
                float yPerlin = ((float)y / height) * scale + offsetY;
                float xPerlin = ((float)x / maxWidth) * scale + offsetX;
                float yPerlin = ((float)y / maxHeight) * scale + offsetY;
                float perlinNoise = Mathf.PerlinNoise(xPerlin, yPerlin);
                if (perlinNoise >= 0.3f)
                if (perlinNoise <= 0.7f)
                {
                    if (!destroyedTiles.Contains(new Vector3Int(x, y, 0)))
                    Vector3Int tileSpawnCoord = new Vector3Int(x, y);
                    if (!destroyedTiles.Contains(tileSpawnCoord))
                    {
                        tilemap.SetTile(new Vector3Int(x, y), forestRuleTile);
                        tilemap.SetTile(tileSpawnCoord, forestRuleTile);
                    }
                }
@@ -83,6 +111,58 @@
                yield return null;
            }
        }
        if (ores != null)
        {
            foreach (Ore ore in ores)
            {
                for (int x = 0; x < maxWidth; x++)
                {
                    for (int y = ore.minSpawnHeight; y < ore.maxSpawnHeight; y++)
                    {
                        float xPerlin = ((float)x / maxWidth) * (float)ore.clusterWeight + offsetX;
                        float yPerlin = ((float)y / maxHeight) * (float)ore.clusterWeight + offsetY;
                        float perlinNoise = Mathf.PerlinNoise(xPerlin, yPerlin);
                        if (perlinNoise <= (1f / (float)ore.weight))
                        {
                            Vector3Int tileSpawnCoord = new Vector3Int(x, y);
                            if (!destroyedTiles.Contains(tileSpawnCoord) && tilemap.HasTile(tileSpawnCoord))
                            {
                                tilemap.SetTile(tileSpawnCoord, ore.tile);
                            }
                        }
                    }
                    // Update UI every 8 lines
                    if ((x % 8) == 0)
                    {
                        yield return null;
                    }
                }
            }
        }
        // generate borders
        for (int x = 0; x <= maxWidth; x += maxWidth)
        {
            for (int y = 0; y <= maxHeight; y++)
            {
                tilemap.SetTile(new Vector3Int(x, y), borderTile);
            }
        }
        yield return null;
        for (int y = 0; y <= maxHeight; y += maxHeight)
        {
            for (int x = 1; x <= maxWidth; x++)
            {
                tilemap.SetTile(new Vector3Int(x, y), borderTile);
            }
        }
        yield return null;
        finishedCallback();
    }
}