using System.Collections.Generic; using Data; using UnityEngine; using UnityEngine.Tilemaps; namespace Managers { /// /// 瓦片管理器,用于加载、初始化和管理瓦片资源。 /// public class TileManager : Utils.Singleton { /// /// 存储瓦片名称与瓦片对象的映射关系。 /// public Dictionary tileBaseMapping = new(); /// /// 存储瓦片索引与瓦片对象的映射关系。 /// 索引由四个整数组成,表示瓦片的组合方式。 /// public Dictionary<(int, int, int, int), TileBase> tileToTileBaseMapping = new(); /// /// 存储瓦片名称与唯一 ID 的映射关系。 /// public Dictionary tileID = new(); /// /// 初始化瓦片管理器。 /// 加载所有瓦片定义、纹理映射表,并生成对应的瓦片对象。 /// public void Init() { if (tileToTileBaseMapping.Count > 0) return; // 初始化图像包管理器 Managers.PackagesImageManager.Instance.Init(); var imagePack = Managers.PackagesImageManager.Instance; // 获取所有瓦片定义 var tileType = Managers.DefineManager.Instance.QueryDefinesByType(); for (var i = 0; i < tileType.Length; i++) { tileID.Add(tileType[i].name, i); } // 处理瓦片纹理映射表定义 var tileTextureMappingDef = Managers.DefineManager.Instance.QueryDefinesByType(); foreach (var mappingTableDef in tileTextureMappingDef) { foreach (var keyVal in mappingTableDef.tileDict) { var key = keyVal.Key; var val = keyVal.Value; // 检查键值格式是否合法 var parts = key.Split('_'); if (parts.Length != 4) { var packName = Managers.DefineManager.Instance.GetDefinePackageName(mappingTableDef); Debug.LogError($"来自{packName}定义的TileMappingTableDef键值{key}内容不合法!\n应该为[瓦片名称_瓦片名称_瓦片名称_瓦片名称]的格式"); continue; } // 检查键值中是否存在未定义的瓦片名称 if (!(tileID.TryGetValue(parts[0], out var k1) && tileID.TryGetValue(parts[1], out var k2) && tileID.TryGetValue(parts[2], out var k3) && tileID.TryGetValue(parts[3], out var k4))) { var packName = Managers.DefineManager.Instance.GetDefinePackageName(mappingTableDef); Debug.LogError($"来自{packName}定义的TileMappingTableDef键值{key}中存在未定义的瓦片名称"); continue; } // 获取对应精灵 var sprite = imagePack.GetSprite(mappingTableDef.packID, val); if (sprite == null) { var packName = Managers.DefineManager.Instance.GetDefinePackageName(mappingTableDef); Debug.LogError($"来自{packName}定义的TileMappingTableDef键值{val}中存在未定义的图片名称"); continue; } // 检查是否存在重复索引 if (tileToTileBaseMapping.ContainsKey((k1, k2, k3, k4))) { var packName = Managers.DefineManager.Instance.GetDefinePackageName(mappingTableDef); Debug.LogWarning($"来自{packName}定义的TileMappingTableDef键值{(k1, k2, k3, k4)}存在重复索引,将忽略重复项"); continue; } // 加载瓦片并存储到映射表中 var tile = LoadTile(sprite); tileToTileBaseMapping[(k1, k2, k3, k4)] = tile; tileBaseMapping[val] = tile; } } } /// /// 重新加载瓦片管理器。 /// 清空当前的瓦片映射表并重新初始化。 /// public void Reload() { tileToTileBaseMapping.Clear(); Init(); } /// /// 将精灵加载为瓦片对象。 /// /// 要加载的精灵。 /// 瓦片的碰撞体类型,默认为 None。 /// 返回加载成功的瓦片对象。 public TileBase LoadTile(Sprite sprite, Tile.ColliderType colliderType = Tile.ColliderType.None) { var newTile = ScriptableObject.CreateInstance(); newTile.sprite = sprite; newTile.color = Color.white; newTile.colliderType = colliderType; return newTile; } } }