List <Vector2Int> TestTile(List <Vector2Int> pointsInt) { List <Vector2Int> vector2Ints = new List <Vector2Int>(); TilemapStructure objectTileStruct = tileGrid.TilemapType[TilemapType.Object]; TilemapStructure groundTileStruct = tileGrid.TilemapType[TilemapType.Ground]; for (int i = 0; i < pointsInt.Count; i++) { Vector2Int tilePos = new Vector2Int(pointsInt[i].x, pointsInt[i].y); int objectTileType = objectTileStruct.GetTileEnumNumber(tilePos.x, tilePos.y); int groundTileType = groundTileStruct.GetTileEnumNumber(tilePos.x, tilePos.y); if (objectTileType != (int)ObjectTileType.Tree) { for (int j = 0; j < poissonSamp.spawnTileType.Length; j++) { if (groundTileType == (int)poissonSamp.spawnTileType[j]) { vector2Ints.Add(tilePos); } } } } return(vector2Ints); }
// Create Random Tile public override void Apply(TilemapStructure tilemapStruct) { TilemapStructure groundTileStruct = tilemapStruct.grid.TilemapType[TilemapType.Ground]; TilemapStructure objectTileStruct = tilemapStruct.grid.TilemapType[TilemapType.Object]; var random = new System.Random(tilemapStruct.grid.Seed); for (int x = 0; x < tilemapStruct.Width; x++) { for (int y = 0; y < tilemapStruct.Height; y++) { foreach (SpawnConfigulation spawnThing in spawnConfigulations) { int groundTile = groundTileStruct.GetTileEnumNumber(x, y); // get tile's tileType, from tilePosition ex) 1 water, 2 sand, 4, grass int objectTile = objectTileStruct.GetTileEnumNumber(x, y); // 0 none, 2000 tree, if (spawnThing.dontSpawnTileType.Length != 0) { for (int i = 0; i < spawnThing.dontSpawnTileType.Length; i++) { if (objectTile != (int)spawnThing.dontSpawnTileType[i]) { setTile(x, y, spawnThing, random, tilemapStruct, groundTile); } } } else { setTile(x, y, spawnThing, random, tilemapStruct, groundTile); } } } } }
/// <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); } } } } } } }