diff --git a/Client/Assets/Scripts/Data/DefinePack.cs b/Client/Assets/Scripts/Data/DefinePack.cs index 88037f6..74968a1 100644 --- a/Client/Assets/Scripts/Data/DefinePack.cs +++ b/Client/Assets/Scripts/Data/DefinePack.cs @@ -109,6 +109,14 @@ namespace Data public string packID; public string packRootPath; + public string Name + { + get + { + return packAbout.name; + } + } + public bool LoadPack(string packPath) { packRootPath=System.IO.Path.GetFullPath(packPath);; diff --git a/Client/Assets/Scripts/Managers/DefineManager.cs b/Client/Assets/Scripts/Managers/DefineManager.cs index 7a78f2f..0c521c6 100644 --- a/Client/Assets/Scripts/Managers/DefineManager.cs +++ b/Client/Assets/Scripts/Managers/DefineManager.cs @@ -106,6 +106,10 @@ namespace Managers return pack; } + public string GetDefinePackageName(Define define) + { + return GetDefinePackage(define)?.Name; + } public string GetPackagePath(string packID) { if (packs.TryGetValue(packID, out var pack)) diff --git a/Client/Assets/Scripts/Managers/PackagesImageManager.cs b/Client/Assets/Scripts/Managers/PackagesImageManager.cs index 01493f7..b645994 100644 --- a/Client/Assets/Scripts/Managers/PackagesImageManager.cs +++ b/Client/Assets/Scripts/Managers/PackagesImageManager.cs @@ -72,5 +72,16 @@ namespace Managers packagesImages.Clear(); Init(); } + + public Sprite GetSprite(string name) + { + return sprites.GetValueOrDefault(name, null); + } + + public Sprite GetSprite(string name, int index) + { + name += $"_{index}"; + return GetSprite(name); + } } } \ No newline at end of file diff --git a/Client/Assets/Scripts/Map/DoubleMap.cs b/Client/Assets/Scripts/Map/DoubleMap.cs index 84fda0f..093e6da 100644 --- a/Client/Assets/Scripts/Map/DoubleMap.cs +++ b/Client/Assets/Scripts/Map/DoubleMap.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Linq; +using Data; using UnityEngine; using UnityEngine.Tilemaps; @@ -36,27 +37,76 @@ namespace Map public class TileManager:Utils.Singleton { - public Dictionary<(int, int, int, int), TileBase> TileToTileBaseMapping = new(); + public Dictionary<(int, int, int, int), TileBase> tileToTileBaseMapping = new(); + public Dictionary tileID = new(); public void Init() { - if( TileToTileBaseMapping.Count>0||!Managers.DefineManager.Instance.defines.TryGetValue("TileDef",out var tileType)) - { + if (tileToTileBaseMapping.Count > 0) return; - } Managers.PackagesImageManager.Instance.Init(); - foreach (var tileDef in tileType.Values) + var imagePack = Managers.PackagesImageManager.Instance; + var tileType = Managers.DefineManager.Instance.QueryDefinesByType(); + for (var i = 1; i < tileType.Length; i++) { - var packPath= Managers.DefineManager.Instance.GetDefinePackage(tileDef)?.packRootPath; - if(packPath==null) - continue; - + 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(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.Add((k1, k2, k3, k4), tile); + } } } public void Reload() { - TileToTileBaseMapping.Clear(); + tileToTileBaseMapping.Clear(); Init(); } + + public TileBase LoadTile(Sprite sprite) + { + var newTile = ScriptableObject.CreateInstance(); + newTile.sprite = sprite; + newTile.color = Color.white; + newTile.colliderType = Tile.ColliderType.Sprite; + return newTile; + } } }