void setTile(int x, int y, SpawnConfigulation spawnThing, System.Random random, TilemapStructure tilemapStruct, int groundTile) { if (spawnThing.spawnTileType.Any(tile => (int)tile == groundTile)) // 타일 중 하나라도 groundTile이랑 같다면 { if (random.Next(0, 100) <= spawnThing.SpawnChancePerCell) { tilemapStruct.SetTileEnumNumber(x, y, (int)spawnThing.objectType); } } }
/// <summary> /// 모래 타일, 물 타일, 풀 타일 뭐 등등 그 중에 풀 타일을 골라 /// 10x10 그리드에 각 셀 하나하나 그 타일의 8개의 이웃타일에게 얼마나 많이 같은 타입이 있는지 세고 /// 그 숫자를 통해 타일들을 같은 타입으로 두냐 아니냐를 선택한다. /// </summary> /// <param name="tilemap"></param> public override void Apply(TilemapStructure tilemap) { int targetTileId = (int)TargetTile; int replaceTileId = (int)ReplaceBy; for (int i = 0; i < Reptitions; i++) { for (int x = 0; x < tilemap.Width; x++) { for (int y = 0; y < tilemap.Height; y++) { var tile = tilemap.GetTileEnumNumber(x, y); if (tile == targetTileId) { var neighbors = tilemap.GetNeighbors(x, y); int targetTilesCount = neighbors.Count(a => a.Value == targetTileId); // 만약 minAlive 숫자가 도달하지 못하면 타일을 교체한다 if (targetTilesCount < minAlive) { if (ReplaceByDominantTile) { int dominantTile = neighbors .GroupBy(a => a.Value) .OrderByDescending(a => a.Count()) .Select(a => a.Key) .First(); tilemap.SetTileEnumNumber(x, y, dominantTile); } else { tilemap.SetTileEnumNumber(x, y, replaceTileId); } } } } } } }
public void Apply(TilemapStructure tilemap) { var validEnumValues = (GroundTileType[])Enum.GetValues(typeof(GroundTileType)); for (int x = 0; x < tilemap.Width; x++) { for (int y = 0; y < tilemap.Height; y++) { var randomValue = (int)validEnumValues[UnityEngine.Random.Range(0, validEnumValues.Length)]; tilemap.SetTileEnumNumber(x, y, randomValue); } } }
public override void Apply(TilemapStructure tilemap) { // Make sure TileType ordered from small to high height tileTypes = tileTypes.OrderBy(a => a.Height).ToArray(); float[] noiseMap = Noise.GenerateNoiseMap(tilemap.Width, tilemap.Height, tilemap.grid.Seed, NoiseScale, Octaves, Persistance, Lacunarity, Offset); if (ApplyIslandGradient) { float[] islandGradient = Noise.GenerateIslandGradientMap(tilemap.Width, tilemap.Height); for (int x = 0, y; x < tilemap.Width; x++) { for (y = 0; y < tilemap.Height; y++) { float subtractedValue = noiseMap[y * tilemap.Width + x] - islandGradient[y * tilemap.Width + x]; // make sure Clamp to 0f~ 1f; noiseMap[y * tilemap.Width + x] = Mathf.Clamp01(subtractedValue); } } } for (int x = 0; x < tilemap.Width; x++) { for (int y = 0; y < tilemap.Height; y++) { float height = noiseMap[y * tilemap.Width + x]; for (int i = 0; i < tileTypes.Length; i++) { if (height <= tileTypes[i].Height) { tilemap.SetTileEnumNumber(x, y, (int)tileTypes[i].tileTypeEnum); break; } } } } }