usingUnityEngine;usingUnityEngine.Tilemaps;usingSystem.Collections.Generic;publicstaticclassCommonTilemap{publicdelegateboolTileMatchPredicate<T>(Ttile)whereT:TileBase;publicstaticList<TileBase>GetAllTiles(Tilemapmap,boolincludeEmptyTiles=false)=>GetAllTiles<TileBase>(map,includeEmptyTiles);publicstaticList<T>GetAllTiles<T>(Tilemapmap,boolincludeEmptyTiles=false)whereT:TileBase{List<T>tiles=newList<T>();ForEachTile(map,(Ttile)=>{if(includeEmptyTiles||tile!=null){tiles.Add(tile);}});returntiles;}publicstaticList<T>GetAllTiles<T>(Tilemapmap,TileMatchPredicate<T>predicate)whereT:TileBase{List<T>tiles=newList<T>();ForEachTile(map,(Ttile)=>{if(tile!=null&&predicate(tile)){tiles.Add(tile);}});returntiles;}publicstaticList<Vector3Int>GetAllTilePositions<T>(Tilemapmap,TileMatchPredicate<T>predicate)whereT:TileBase{List<Vector3Int>result=newList<Vector3Int>();ForEachTile(map,(Vector3Intpos)=>{Ttile=map.GetTile<T>(pos);if(tile!=null&&predicate(tile)){result.Add(pos);}});returnresult;}publicstaticList<Vector3Int>GetSurroudingTilePositions(Vector3Intpos){List<Vector3Int>result=newList<Vector3Int>();// [ ] [ ] [ ]// [ ] [X] [ ]// [ ] [ ] [ ]result.Add(newVector3Int(pos.x-1,pos.y+1,pos.z));result.Add(newVector3Int(pos.x,pos.y+1,pos.z));result.Add(newVector3Int(pos.x+1,pos.y+1,pos.z));result.Add(newVector3Int(pos.x-1,pos.y,pos.z));result.Add(newVector3Int(pos.x+1,pos.y,pos.z));result.Add(newVector3Int(pos.x-1,pos.y-1,pos.z));result.Add(newVector3Int(pos.x,pos.y-1,pos.z));result.Add(newVector3Int(pos.x+1,pos.y-1,pos.z));returnresult;}publicstaticvoidForEachTile(Tilemapmap,System.Action<TileBase>tileAction)=>ForEachTile<TileBase>(map,tileAction);publicstaticvoidForEachTile<T>(Tilemapmap,System.Action<T>tileAction)whereT:TileBase=>ForEachTile(map,(Vector3Intpos,Tilemapmap)=>{Ttile=map.GetTile<T>(pos);tileAction?.Invoke(tile);});publicstaticvoidForEachTile<T>(Tilemapmap,System.Action<T,Vector3Int>tileAction)whereT:TileBase=>ForEachTile(map,(Vector3Intpos,Tilemapmap)=>{Ttile=map.GetTile<T>(pos);tileAction?.Invoke(tile,pos);});publicstaticvoidForEachTile<T>(Tilemapmap,System.Action<Vector3Int>tileAction)whereT:TileBase=>ForEachTile(map,(Vector3Intpos,Tilemapmap)=>{Ttile=map.GetTile<T>(pos);if(tile!=null){tileAction?.Invoke(pos);}});publicstaticvoidForEachTile(Tilemapmap,System.Action<Vector3Int>tileAction)=>ForEachTile(map,(Vector3Intpos,Tilemapmap)=>{tileAction?.Invoke(pos);});publicstaticvoidForEachTile(Tilemapmap,System.Action<Vector3Int,Tilemap>tileAction){// Foreach tilemap, we want to set the z value of its tiles.BoundsIntbounds=map.cellBounds;for(inti=0;i<bounds.size.x;i++){for(intj=0;j<bounds.size.y;j++){for(intk=0;k<bounds.size.z;k++){Vector3InttilePos=newVector3Int(bounds.min.x+i,bounds.min.y+j,bounds.min.z+k);tileAction?.Invoke(tilePos,map);}}}}publicstaticVector3IntRandomPositionInBounds(Tilemapmap){BoundsIntbounds=map.cellBounds;returnnewVector3Int(x:Random.Range(bounds.min.x,bounds.max.x-1),y:Random.Range(bounds.min.y,bounds.max.y-1),z:Random.Range(bounds.min.z,bounds.max.z-1));}publicstaticboolIsInBounds(Tilemapmap,Vector3Intpos){BoundsIntbounds=map.cellBounds;returnpos.x>bounds.min.x&&pos.x<bounds.max.x&&pos.y>bounds.min.y&&pos.y<bounds.max.y&&pos.z>bounds.min.z&&pos.z<bounds.max.z;}}