(client) fix:修复DefineManager没有解析数组类型的Define字段导致定义查找失败
This commit is contained in:
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user