using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Tilemaps; using UnityEngine.UIElements; public class GenerateTileMap : MonoBehaviour { public int? seed; public int width = 256; public int height = 256; private float scale; private float offsetX; private float offsetY; Tilemap tilemap; public RuleTile forestRuleTile; public TileBase borderTile; //public List tiles; private void Awake() { tilemap = GetComponent(); #if DEBUG //seed = 0123456789; #endif if (seed == null) { seed = GenerateSeed(9); } SetSettingsFromSeed(seed.Value); } public void SetSettingsFromSeed(int seed) { UnityEngine.Random.State randomState = UnityEngine.Random.state; UnityEngine.Random.InitState(seed); scale = UnityEngine.Random.Range(17f, 23f); offsetX = UnityEngine.Random.Range(-10000f, 10000f); offsetY = UnityEngine.Random.Range(-10000f, 10000f); UnityEngine.Random.state = randomState; } private int GenerateSeed(int size) { System.Random rand = new System.Random(); string seedNumbers = "0123456789"; char[] chars = new char[size]; for (int i = 0; i < size; i++) { chars[i] = seedNumbers[rand.Next(seedNumbers.Length)]; } return int.Parse(new string(chars)); } public IEnumerator GenerateTiles(Action finishedCallback, List destroyedTiles) { for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { float xPerlin = ((float)x / width) * scale + offsetX; float yPerlin = ((float)y / height) * scale + offsetY; float perlinNoise = Mathf.PerlinNoise(xPerlin, yPerlin); if (perlinNoise >= 0.3f) { if (!destroyedTiles.Contains(new Vector3Int(x, y, 0))) { tilemap.SetTile(new Vector3Int(x, y), forestRuleTile); } } } // Update UI every 8 lines if ((x % 8) == 0) { yield return null; } } finishedCallback(); } }