using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Tilemaps; using Random = System.Random; namespace MoreMountains.Tools { /// <summary> /// A collection of helper methods for interacting with Tilemaps /// </summary> public class MMTilemap : MonoBehaviour { /// <summary> /// Returns a random world position on the specified tilemap/grid combo, filled or not based on the shouldBeFilled flag /// </summary> /// <param name="targetTilemap"></param> /// <param name="grid"></param> /// <param name="width"></param> /// <param name="height"></param> /// <param name="shouldBeFilled"></param> /// <param name="maxIterations"></param> /// <returns></returns> public static Vector2 GetRandomPosition(Tilemap targetTilemap, Grid grid, int width, int height, bool shouldBeFilled = true, int maxIterations = 1000) { int iterationsCount = 0; Vector3Int randomCoordinate = Vector3Int.zero; while (iterationsCount < maxIterations) { randomCoordinate.x = UnityEngine.Random.Range(0, width); randomCoordinate.y = UnityEngine.Random.Range(0, height); randomCoordinate += MMTilemapGridRenderer.ComputeOffset(width-1, height-1); bool hasTile = targetTilemap.HasTile(randomCoordinate); if (hasTile == shouldBeFilled) { return targetTilemap.CellToWorld(randomCoordinate) + (grid.cellSize / 2); } iterationsCount++; } return Vector2.zero; } /// <summary> /// Returns a random position on the ground floor of the grid /// </summary> /// <param name="targetTilemap"></param> /// <param name="grid"></param> /// <param name="width"></param> /// <param name="height"></param> /// <param name="startingHeight"></param> /// <param name="xMin"></param> /// <param name="xMax"></param> /// <param name="shouldBeFilled"></param> /// <param name="maxIterations"></param> /// <returns></returns> public static Vector2 GetRandomPositionOnGround(Tilemap targetTilemap, Grid grid, int width, int height, int startingHeight, int xMin, int xMax, bool shouldBeFilled = true, int maxIterations = 1000) { int iterationsCount = 0; Vector3Int randomCoordinate = Vector3Int.zero; while (iterationsCount < maxIterations) { randomCoordinate.x = UnityEngine.Random.Range(xMin, xMax); randomCoordinate.y = startingHeight; randomCoordinate += MMTilemapGridRenderer.ComputeOffset(width-1, height-1); int counter = height; while (counter > 0) { bool hasTile = targetTilemap.HasTile(randomCoordinate); if (hasTile == shouldBeFilled) { randomCoordinate.y++; return targetTilemap.CellToWorld(randomCoordinate) + (grid.cellSize / 2); } randomCoordinate.y--; counter--; } iterationsCount++; } return Vector2.zero; } } }