(client) feat:健康给予,路径优化,结算界面,商店界面 (#60)

Co-authored-by: m0_75251201 <m0_75251201@noreply.gitcode.com>
Reviewed-on: http://47.107.252.169:3000/Roguelite-Game-Developing-Team/Gen_Hack-and-Slash-Roguelite/pulls/60
This commit is contained in:
2025-10-10 14:08:23 +08:00
parent 9a797479ff
commit 16b49f3d3a
1900 changed files with 114053 additions and 34157 deletions

View File

@@ -1,15 +1,15 @@
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
// 未在提供代码段中使用,但保留以便与原始上下文保持一致
// 未在提供代码段中使用,但保留以便与原始上下文保持一致
using System.Xml.Linq;
// 未在提供代码段中使用,但保留以便与原始上下文保持一致
using UnityEngine;
using UnityEngine.Networking;
using Object = UnityEngine.Object;
// 未在提供代码段中使用,但保留以便与原始上下文保持一致
// 未在提供代码段中使用,但保留以便与原始上下文保持一致
// 未在提供代码段中使用,但保留以便与原始上下文保持一致
// 未在提供代码段中使用,但保留以便与原始上下文保持一致
@@ -19,7 +19,6 @@ namespace Configs
{
public static class ConfigProcessor
{
/// <summary>
/// 获取指定路径下的所有xml文件
/// </summary>
@@ -30,7 +29,6 @@ namespace Configs
var xmlFilePaths = new List<string>();
foreach (var path in paths)
{
try
{
// 检查目录是否存在
@@ -51,7 +49,6 @@ namespace Configs
// 优化错误信息,明确是哪个路径出现问题
Debug.LogError($"获取路径 '{path}' 下的XML文件时发生错误: {ex.Message}");
}
}
return xmlFilePaths;
}
@@ -125,13 +122,14 @@ namespace Configs
return result;
}
/// <summary>
/// 用于加载指定路径下的所有资源,并返回资源名称和加载好的资源的键值对。
/// 用于加载指定路径下的所有资源,并返回资源名称和加载好的资源的键值对。
/// </summary>
/// <typeparam name="T">资源类型</typeparam>
/// <param name="path">资源路径(相对于 Resources 文件夹)</param>
/// <returns>字典,键为资源名称,值为加载好的资源</returns>
public static Dictionary<string, T> LoadResources<T>(string path) where T : UnityEngine.Object
public static Dictionary<string, T> LoadResources<T>(string path) where T : Object
{
// 创建一个字典来存储资源名称和加载好的资源
var resourceDict = new Dictionary<string, T>();
@@ -140,20 +138,18 @@ namespace Configs
var resources = Resources.LoadAll<T>(path);
foreach (var resource in resources)
{
if (resource != null)
{
// 获取资源名称并存入字典
var resourceName = resource.name;
resourceDict[resourceName] = resource;
}
}
return resourceDict;
}
/// <summary>
/// 从外部指定文件中加载图片
/// 从外部指定文件中加载图片
/// </summary>
/// <param name="filePath">图片文件的完整路径</param>
/// <returns>加载成功的 Texture2D 对象,或加载失败时返回 null</returns>
@@ -179,7 +175,7 @@ namespace Configs
// 使用 using 自动管理 FileStream 的生命周期
using (var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
bytes = new byte[fs.Length]; // 创建一个字节数组来存储文件内容
bytes = new byte[fs.Length]; // 创建一个字节数组来存储文件内容
fs.Read(bytes, 0, bytes.Length); // 读取文件内容到字节数组
}
}
@@ -200,14 +196,13 @@ namespace Configs
return texture; // 返回加载成功的 Texture2D 对象
}
else
{
Debug.LogError("图片加载失败,请检查文件格式是否正确!");
return null;
}
Debug.LogError("图片加载失败,请检查文件格式是否正确!");
return null;
}
/// <summary>
/// 获取指定目录下所有匹配后缀名的文件路径(可递归)
/// 获取指定目录下所有匹配后缀名的文件路径(可递归)
/// </summary>
/// <param name="directoryPath">目标文件夹路径</param>
/// <param name="extensions">后缀名列表(如 ["txt", "jpg"]</param>
@@ -240,10 +235,7 @@ namespace Configs
foreach (var file in files)
{
var ext = Path.GetExtension(file).TrimStart('.').ToLower();
if (normalizedExtensions.Contains(ext))
{
result.Add(file);
}
if (normalizedExtensions.Contains(ext)) result.Add(file);
}
}
catch (UnauthorizedAccessException ex)
@@ -254,14 +246,15 @@ namespace Configs
return result;
}
/// <summary>
/// 根据文件路径推断音频类型。
/// 根据文件路径推断音频类型。
/// </summary>
/// <param name="filePath">音频文件的完整路径。</param>
/// <returns>推断出的 AudioType如果无法推断则返回 AudioType.UNKNOWN。</returns>
private static AudioType GetAudioTypeFromFilePath(string filePath)
{
string ext = Path.GetExtension(filePath)?.ToLower(); // 获取扩展名并转小写
var ext = Path.GetExtension(filePath)?.ToLower(); // 获取扩展名并转小写
switch (ext)
{
case ".wav": return AudioType.WAV;
@@ -274,9 +267,10 @@ namespace Configs
return AudioType.UNKNOWN; // 让Unity尝试自动检测但成功率可能不如指定类型高
}
}
/// <summary>
/// 从外部指定文件中异步加载音频。
/// 注意:此方法是异步的,需要使用 await 调用。在Unity主线程中调用以避免潜在的线程问题。
/// 从外部指定文件中异步加载音频。
/// 注意:此方法是异步的,需要使用 await 调用。在Unity主线程中调用以避免潜在的线程问题。
/// </summary>
/// <param name="filePath">音频文件的完整路径。</param>
/// <returns>Task其结果为加载成功的 AudioClip 对象,或加载失败时返回 null。</returns>
@@ -295,11 +289,11 @@ namespace Configs
}
// UnityWebRequest需要使用file://协议来访问本地文件
string uri = "file://" + Path.GetFullPath(filePath);
var uri = "file://" + Path.GetFullPath(filePath);
// 根据文件扩展名推断音频类型
AudioType audioType = GetAudioTypeFromFilePath(filePath);
var audioType = GetAudioTypeFromFilePath(filePath);
using (UnityWebRequest www = UnityWebRequestMultimedia.GetAudioClip(uri, audioType))
using (var www = UnityWebRequestMultimedia.GetAudioClip(uri, audioType))
{
try
{
@@ -312,21 +306,18 @@ namespace Configs
// 检查请求结果
// www.isNetworkError 或 www.isHttpError 在较新的Unity版本中已弃用
// 推荐使用 www.result。
if (www.result == UnityWebRequest.Result.ConnectionError || www.result == UnityWebRequest.Result.ProtocolError)
if (www.result == UnityWebRequest.Result.ConnectionError ||
www.result == UnityWebRequest.Result.ProtocolError)
{
Debug.LogError($"加载音频文件 '{filePath}' 失败: {www.error}");
return null;
}
else
{
// 获取下载的AudioClip
AudioClip clip = DownloadHandlerAudioClip.GetContent(www);
if (clip == null)
{
Debug.LogError($"未能从文件 '{filePath}' 获取 AudioClip 内容,请检查文件是否损坏或格式是否支持 ({audioType} 类型).");
}
return clip;
}
// 获取下载的AudioClip
var clip = DownloadHandlerAudioClip.GetContent(www);
if (clip == null)
Debug.LogError($"未能从文件 '{filePath}' 获取 AudioClip 内容,请检查文件是否损坏或格式是否支持 ({audioType} 类型).");
return clip;
}
catch (Exception e)
{
@@ -335,6 +326,5 @@ namespace Configs
}
}
}
}
}
}