SamsonGame/Assets/Sources/Feel/MMTools/Tools/MMHelpers/MMTilemap.cs

93 lines
3.5 KiB
C#

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;
}
}
}