| | |
| | | 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 maxWidth = 256; |
| | | public int maxHeight = 384; |
| | | public int maxGroundHeight = 256; |
| | | public static int maxWidth = 256; |
| | | public static int maxHeight = 384; |
| | | public static 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) |
| | | { |
| | |
| | | } |
| | | |
| | | SetSettingsFromSeed(seed.Value); |
| | | |
| | | transform.position = new Vector3((maxWidth / 2) * -1, (maxGroundHeight + 1) * -1, transform.position.z); |
| | | } |
| | | |
| | | public void SetSettingsFromSeed(int seed) |
| | |
| | | |
| | | public IEnumerator GenerateTiles(Action finishedCallback, List<Vector3Int> destroyedTiles) |
| | | { |
| | | // generate ground |
| | | for (int x = 1; x < maxWidth; x++) |
| | | { |
| | | for (int y = 1; y < maxGroundHeight; y++) |
| | |
| | | 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); |
| | | } |
| | | } |
| | | |
| | |
| | | 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++) |