文章首发见博客:https://mwhls.top/4816.html。
无图/格式错误/后续更新请见首发页。
更多更新请到mwhls.top查看
欢迎留言提问或批评建议,私信不回。
汇总:Unity 记录
摘要:点击tilemap,文件 保存/读取 该地图区块数据。
tile.name
为tile的文件名,因此tilemap保存为ID数组时,需要将tile转name,在从name转ID。ID2tileName
字典被设计,即ID转name转tile。name2tile
字典被设计。 public struct TileInfo{
public string ID;
public string name;
public string description;
public string path;
};
public struct TilesInfo{
public string version;
public string date;
public Dictionary<string, TileInfo> tiles;
}
public struct TilemapInfo{
public int[] block_offset;
public List<List<string>> map;
}
private static TilesInfo tilemap_info;
private Dictionary<string, TileBase> name2tile;
private Dictionary<string, string> ID2tileName;
public Vector3Int block_size;
TilesInfo
,即名字转路径,用于从本地读取tile。 void load_tiles_info(){
// load config
string tiles_info_path = "Assets/Resources/Saved/TilesInfo.json";
string jsonText = File.ReadAllText(tiles_info_path);
tilemap_info = JsonConvert.DeserializeObject<TilesInfo>(jsonText);
// init
name2tile = new Dictionary<string, TileBase>();
ID2tileName = new Dictionary<string, string>();
// init ID2tileName
ID2tileName.Add("0", "");
foreach (var tile_kv in tilemap_info.tiles){
ID2tileName.Add(tile_kv.Value.ID, tile_kv.Key);
}
}
public TileBase map_name_to_tile(string name){
if (name == ""){
// No tile
return null;
}
if (name2tile.ContainsKey(name)){
// Tile have been loaded
return name2tile[name];
}
else{
// Load tile
string tile_path = tilemap_info.tiles[name].path;
TileBase tile = Resources.Load<TileBase>(tile_path);
name2tile.Add(name, tile);
return tile;
}
}
public TileBase map_ID_to_tile(string ID){
return map_name_to_tile(ID2tileName[ID]);
}
public string map_tile_to_ID(TileBase tile){
if (tile == null){
return "0";
}
else{
return tilemap_info.tiles[tile.name].ID;
}
}
public void save_tilemap(Tilemap tilemap, int[] block_offsets){
// file name
string filename = "Map_" + block_offsets[0] + "-" + block_offsets[1] + ".json";
string file_path = "Assets/Resources/Saved/" + filename;
// Get actual position of block
Vector3Int map_offset = new Vector3Int(block_offsets[0] * block_size[0], block_offsets[1] * block_size[1]);
// Init tilemap struct
TilemapInfo tilemap_info = new TilemapInfo {};
tilemap_info.block_offset = block_offsets;
tilemap_info.map = new List<List<string>>();
// Loop for saving
for (int x = 0; x < block_size[0]; x++){
List<string> map_row = new List<string>();
for (int y = 0; y < block_size[1]; y++){
// Get actual position of tile
Vector3Int tile_offset = new Vector3Int(map_offset[0] + x, map_offset[1] + y);
TileBase tile = tilemap.GetTile(tile_offset);
// Record tile info
string tile_ID = map_tile_to_ID(tile);
map_row.Add(tile_ID);
}
tilemap_info.map.Add(map_row);
}
// save
string tilemap_info_json = JsonConvert.SerializeObject(tilemap_info, Formatting.Indented);
File.WriteAllText(file_path, tilemap_info_json);
}
public void load_tilemap(Tilemap tilemap, int[] block_offsets){
// read file
string filename = "Map_" + block_offsets[0] + "-" + block_offsets[1] + ".json";
string file_path = "Assets/Resources/Saved/" + filename;
if (!File.Exists(file_path)){
// No data
return;
}
string jsonText = File.ReadAllText(file_path);
TilemapInfo block_info = JsonConvert.DeserializeObject<TilemapInfo>(jsonText);
// Get actual position of block
Vector3Int map_offset = new Vector3Int(block_offsets[0] * block_size[0], block_offsets[1] * block_size[1]);
// Loop for loading
for (int x = 0; x < block_size[0]; x++){
List<string> map_row = new List<string>();
for (int y = 0; y < block_size[1]; y++){
// Get actual position of tile
Vector3Int tile_offset = new Vector3Int(map_offset[0] + x, map_offset[1] + y);
string tile_ID = block_info.map[x][y];
// Load tile
TileBase tile = map_ID_to_tile(tile_ID);
tilemap.SetTile(tile_offset, tile);
}
}
if (input_base.isKeydown("Fire2")){
Vector3Int pos_tilemap = tilemap_modify.WorldToCell(input_base.get_mouse_pos(1));
int[] block_offset = {Mathf.Abs(pos_tilemap.x) / tilemap_base.block_size[0], Mathf.Abs(pos_tilemap.y) / tilemap_base.block_size[1]};
if (pos_tilemap.x < 0){
block_offset[0] = -block_offset[0] - 1;
}
if (pos_tilemap.y < 0){
block_offset[1] = -block_offset[1] - 1;
}
Debug.Log("Mouse pos: [" + pos_tilemap.x + ", " + pos_tilemap.y + "].");
Debug.Log("Block offset: [" + block_offset[0] + ", " + block_offset[1] + "].");
tilemap_base.save_tilemap(tilemap_modify, block_offset);
}
if (input_base.isKeydown("Fire3")){
Vector3Int pos_tilemap = tilemap_modify.WorldToCell(input_base.get_mouse_pos(1));
int[] block_offset = {Mathf.Abs(pos_tilemap.x) / tilemap_base.block_size[0], Mathf.Abs(pos_tilemap.y) / tilemap_base.block_size[1]};
if (pos_tilemap.x < 0){
block_offset[0] = -block_offset[0] - 1;
}
if (pos_tilemap.y < 0){
block_offset[1] = -block_offset[1] - 1;
}
Debug.Log("Mouse pos: [" + pos_tilemap.x + ", " + pos_tilemap.y + "].");
Debug.Log("Block offset: [" + block_offset[0] + ", " + block_offset[1] + "].");
tilemap_base.load_tilemap(tilemap_modify, block_offset);
}