(client) fix:修复DefineManager没有解析数组类型的Define字段导致定义查找失败

This commit is contained in:
m0_75251201
2025-07-25 17:27:08 +08:00
parent c4ddc0d693
commit bbe4955ccf
9 changed files with 194 additions and 65 deletions

View File

@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Data;
using NUnit.Framework;
using UnityEngine;
@ -15,7 +16,7 @@ namespace Managers
//包名,图片名
public Dictionary<string, Dictionary<string, Sprite>> sprites = new();
//包名,文件路径,身体部件名
public Dictionary<string, Dictionary<string, Dictionary<string, List<Sprite>>>> bodyTexture = new();
public Dictionary<string, Dictionary<string, Dictionary<string, Sprite>>> bodyTexture = new();
public void Init()
{
@ -83,7 +84,8 @@ namespace Managers
new Vector2(0.5f, 0.5f) // 中心点
);
var name=Path.GetFileNameWithoutExtension(path);
InsertBodySprite(drawOrder.packID, drawOrder.texturePath, name, spr);
InsertBodyTexture(drawOrder.packID, drawOrder.texturePath, name, spr);
}
}
}
@ -115,7 +117,7 @@ namespace Managers
if (!sprites.ContainsKey(packId))
sprites[packId] = new Dictionary<string, Sprite>();
Rect spriteRect = new Rect(0, 0, textureWidth, textureHeight);
var spriteRect = new Rect(0, 0, textureWidth, textureHeight);
var sprite = Sprite.Create(texture, spriteRect, new Vector2(0.5f, 0.5f), pixelsPerUnit);
sprites[packId][baseName] = sprite;
return;
@ -180,34 +182,95 @@ namespace Managers
return GetSprite(packID, fullName);
}
/// <summary>
/// 插入 Sprite 到指定的嵌套字典中
/// 向 bodyTexture 插入一张 Sprite
/// 如果包名、路径或部件名原本不存在,会自动建立对应的 Dictionary。
/// </summary>
/// <param name="packageName">包名</param>
/// <param name="filePath">文件路径</param>
/// <param name="bodyPartName">身体部件名</param>
/// <param name="sprite">要插入的 Sprite 对象。</param>
public void InsertBodySprite(string packageName, string filePath, string bodyPartName, Sprite sprite)
/// <param name="packageName">包名</param>
/// <param name="filePath">文件路径</param>
/// <param name="bodyPartName">身体部件名</param>
/// <param name="sprite">要插入的 Sprite</param>
public void InsertBodyTexture(string packageName,
string filePath,
string bodyPartName,
Sprite sprite)
{
// 确保第一层字典(包名)存在
if (!bodyTexture.ContainsKey(packageName))
if (sprite == null)
{
bodyTexture[packageName] = new Dictionary<string, Dictionary<string, List<Sprite>>>();
Debug.LogWarning("InsertBodyTexture: sprite 为 null已忽略。");
return;
}
// 确保第二层字典(文件路径)存在
if (!bodyTexture[packageName].ContainsKey(filePath))
// 1) 处理包名层级
if (!bodyTexture.TryGetValue(packageName, out var pathDict))
{
bodyTexture[packageName][filePath] = new Dictionary<string, List<Sprite>>();
pathDict = new Dictionary<string, Dictionary<string, Sprite>>();
bodyTexture[packageName] = pathDict;
}
// 确保第三层字典(身体部件名)存在
if (!bodyTexture[packageName][filePath].ContainsKey(bodyPartName))
// 2) 处理文件路径层级
if (!pathDict.TryGetValue(filePath, out var partDict))
{
bodyTexture[packageName][filePath][bodyPartName] = new List<Sprite>();
partDict = new Dictionary<string, Sprite>();
pathDict[filePath] = partDict;
}
// 将 Sprite 添加到列表中
bodyTexture[packageName][filePath][bodyPartName].Add(sprite);
// 3) 插入或覆盖部件名
partDict[bodyPartName] = sprite;
}
/// <summary>
/// 查找身体部件的所有Sprite变体支持带编号的图片
/// </summary>
/// <param name="packageName">包名</param>
/// <param name="filePath">文件路径</param>
/// <param name="bodyPartName">身体部件名</param>
/// <returns>按编号排序的Sprite数组未找到时返回空数组</returns>
public Sprite[] FindBodyTextures(string packageName, string filePath, string bodyPartName)
{
// 检查包名是否存在
if (!bodyTexture.TryGetValue(packageName, out var packageDict))
{
Debug.LogWarning($"Package '{packageName}' not found.");
return Array.Empty<Sprite>();
}
// 检查文件路径是否存在
if (!packageDict.TryGetValue(filePath, out var pathDict))
{
Debug.LogWarning($"File path '{filePath}' not found in package '{packageName}'.");
return Array.Empty<Sprite>();
}
// 收集所有匹配的Sprite
var sprites = new List<(int order, Sprite sprite)>();
// 查找完全匹配的项(无编号)
if (pathDict.TryGetValue(bodyPartName, out var baseSprite))
{
sprites.Add((0, baseSprite));
}
// 查找带编号的变体
var prefix = bodyPartName + "_";
foreach (var (key, value) in pathDict)
{
// 检查是否以部件名+下划线开头
if (key.StartsWith(prefix) && key.Length > prefix.Length)
{
var suffix = key.Substring(prefix.Length);
// 尝试解析编号
if (int.TryParse(suffix, out var number))
{
sprites.Add((number, Value: value));
}
}
}
// 按编号排序无编号视为0
return sprites
.OrderBy(x => x.order)
.Select(x => x.sprite)
.ToArray();
}
}
}