diff --git a/Assets/ModuleCore/ModuleAnalysis/AnalysisCollector.cs b/Assets/ModuleCore/ModuleAnalysis/AnalysisCollector.cs index 4e96176..23ce4a8 100644 --- a/Assets/ModuleCore/ModuleAnalysis/AnalysisCollector.cs +++ b/Assets/ModuleCore/ModuleAnalysis/AnalysisCollector.cs @@ -25,7 +25,7 @@ public class AnalysisCollector : Module { SaveTool.SaveText(FileName.Create(code), json); StockToAnalysis(json, action); }; - WebRequestAsync.Execute(request); + request.SendAsync(); } public void StockToAnalysis(string json, Action> action = null) { diff --git a/Packages/Network/Runtime/DataRequestTexture.cs b/Packages/Network/Runtime/DataRequestTexture.cs deleted file mode 100644 index 1bef412..0000000 --- a/Packages/Network/Runtime/DataRequestTexture.cs +++ /dev/null @@ -1,37 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using UnityEngine; -using UnityEngine.Networking; - -namespace MuHua { - /// - /// Get下载 Texture - /// - public class DataRequestTexture : DataRequest { - public readonly string url; - - public Action OnError; - public Action OnCallback; - - public override string Url => url; - public override WebRequestType RequestType => WebRequestType.Texture; - - /// Web Get请求 Texture - public DataRequestTexture(string url, Action OnCallback = null) { - this.url = url; - this.OnCallback = OnCallback; - } - - public override void RequestResultHandle(bool isDone, UnityWebRequest web) { - DownloadHandler downloadHandler = web.downloadHandler; - if (!isDone) { OnError?.Invoke(downloadHandler.text); return; } - DownloadHandlerTexture dht = downloadHandler as DownloadHandlerTexture; - Texture2D texture = dht.texture; - bool compress = (texture.width % 2) == 0 && (texture.height % 2) == 0; - if (compress) { texture.Compress(true); } - else { Debug.LogWarning($"无法压缩的图片:{web.url}"); } - OnCallback?.Invoke(texture); - } - } -} \ No newline at end of file diff --git a/Packages/Network/Runtime/ModuleData.meta b/Packages/Network/Runtime/ModuleData.meta new file mode 100644 index 0000000..f541487 --- /dev/null +++ b/Packages/Network/Runtime/ModuleData.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c75f34b2e714238459d0e95f16c7a7e1 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Network/Runtime/DataRequest.cs b/Packages/Network/Runtime/ModuleData/DataRequest.cs similarity index 68% rename from Packages/Network/Runtime/DataRequest.cs rename to Packages/Network/Runtime/ModuleData/DataRequest.cs index 4fcabaa..9fcffd1 100644 --- a/Packages/Network/Runtime/DataRequest.cs +++ b/Packages/Network/Runtime/ModuleData/DataRequest.cs @@ -11,7 +11,7 @@ namespace MuHua { /// Web请求地址 public abstract string Url { get; } /// Web请求类型 - public abstract WebRequestType RequestType { get; } + public abstract EnumNetworkRequestType RequestType { get; } /// 提交json数据 public virtual string Json { get; } /// 提交Form表单数据 @@ -19,5 +19,10 @@ namespace MuHua { /// Web请求结果处理 public abstract void RequestResultHandle(bool isDone, UnityWebRequest web); + + /// 发送请求 + public virtual IEnumerator Send() => NetworkRequest.Execute(this); + /// 发送请求(异步) + public virtual void SendAsync() => NetworkRequestAsync.Execute(this); } } \ No newline at end of file diff --git a/Packages/Network/Runtime/DataRequest.cs.meta b/Packages/Network/Runtime/ModuleData/DataRequest.cs.meta similarity index 100% rename from Packages/Network/Runtime/DataRequest.cs.meta rename to Packages/Network/Runtime/ModuleData/DataRequest.cs.meta diff --git a/Packages/Network/Runtime/ModuleData/DataRequestAudio.cs b/Packages/Network/Runtime/ModuleData/DataRequestAudio.cs new file mode 100644 index 0000000..3bce235 --- /dev/null +++ b/Packages/Network/Runtime/ModuleData/DataRequestAudio.cs @@ -0,0 +1,40 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.Networking; + +namespace MuHua { + public class DataRequestAudio : DataRequest { + public readonly string url; + public Action OnError; // 错误回调 + public Action OnCallback; // 成功回调 + + public override string Url => url; + public override EnumNetworkRequestType RequestType => EnumNetworkRequestType.Audio; + + public DataRequestAudio(string url, Action OnCallback = null, Action OnError = null) { + this.url = url; + this.OnCallback = OnCallback; + this.OnError = OnError; + } + + public override void RequestResultHandle(bool isDone, UnityWebRequest web) { + if (!isDone) { + OnError?.Invoke($"Audio download failed: {web.error}"); + return; + } + // 获取音频数据 + DownloadHandlerAudioClip downloadHandler = web.downloadHandler as DownloadHandlerAudioClip; + if (downloadHandler == null || downloadHandler.audioClip == null) { + OnError?.Invoke("Failed to load audio clip."); + return; + } + // 获取音频长度并打印 + AudioClip audioClip = downloadHandler.audioClip; + Debug.Log($"Audio downloaded successfully: {url}, Length: {audioClip.length} seconds"); + // 回调返回音频数据 + OnCallback?.Invoke(audioClip); + } + } +} diff --git a/Packages/Network/Runtime/ModuleData/DataRequestAudio.cs.meta b/Packages/Network/Runtime/ModuleData/DataRequestAudio.cs.meta new file mode 100644 index 0000000..c054b37 --- /dev/null +++ b/Packages/Network/Runtime/ModuleData/DataRequestAudio.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 383ac0bd35c136246aa13a5cbb60b0b1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Network/Runtime/DataRequestGet.cs b/Packages/Network/Runtime/ModuleData/DataRequestGet.cs similarity index 85% rename from Packages/Network/Runtime/DataRequestGet.cs rename to Packages/Network/Runtime/ModuleData/DataRequestGet.cs index 35389e3..a17428a 100644 --- a/Packages/Network/Runtime/DataRequestGet.cs +++ b/Packages/Network/Runtime/ModuleData/DataRequestGet.cs @@ -11,11 +11,12 @@ namespace MuHua { public class DataRequestGet : DataRequest { public readonly string url; + public string result; public Action OnError; public Action OnCallback; public override string Url => url; - public override WebRequestType RequestType => WebRequestType.GET; + public override EnumNetworkRequestType RequestType => EnumNetworkRequestType.GET; /// Web Get请求数据 public DataRequestGet(string url, Action OnCallback = null) { @@ -25,6 +26,7 @@ namespace MuHua { public override void RequestResultHandle(bool isDone, UnityWebRequest web) { DownloadHandler downloadHandler = web.downloadHandler; + result = downloadHandler.text; if (!isDone) { OnError?.Invoke(downloadHandler.text); return; } OnCallback?.Invoke(downloadHandler.text); } diff --git a/Packages/Network/Runtime/DataRequestGet.cs.meta b/Packages/Network/Runtime/ModuleData/DataRequestGet.cs.meta similarity index 100% rename from Packages/Network/Runtime/DataRequestGet.cs.meta rename to Packages/Network/Runtime/ModuleData/DataRequestGet.cs.meta diff --git a/Packages/Network/Runtime/DataRequestPost.cs b/Packages/Network/Runtime/ModuleData/DataRequestPost.cs similarity index 82% rename from Packages/Network/Runtime/DataRequestPost.cs rename to Packages/Network/Runtime/ModuleData/DataRequestPost.cs index d265f3c..c3726de 100644 --- a/Packages/Network/Runtime/DataRequestPost.cs +++ b/Packages/Network/Runtime/ModuleData/DataRequestPost.cs @@ -12,13 +12,14 @@ namespace MuHua { public readonly string url; public readonly string json; public readonly WWWForm form; - public readonly WebRequestType type; + public readonly EnumNetworkRequestType type; + public string result; public Action OnError; public Action OnCallback; public override string Url => url; - public override WebRequestType RequestType => type; + public override EnumNetworkRequestType RequestType => type; public override string Json => json; public override WWWForm Form => form; @@ -27,18 +28,19 @@ namespace MuHua { this.url = url; this.json = json; this.OnCallback = OnCallback; - type = WebRequestType.PostJson; + type = EnumNetworkRequestType.PostJson; } /// Web Post请求 提交WWWForm数据 public DataRequestPost(string url, WWWForm form, Action OnCallback = null) { this.url = url; this.form = form; this.OnCallback = OnCallback; - type = WebRequestType.PostForm; + type = EnumNetworkRequestType.PostForm; } public override void RequestResultHandle(bool isDone, UnityWebRequest web) { DownloadHandler downloadHandler = web.downloadHandler; + result = downloadHandler.text; if (!isDone) { OnError?.Invoke(downloadHandler.text); return; } OnCallback?.Invoke(downloadHandler.text); } diff --git a/Packages/Network/Runtime/DataRequestPost.cs.meta b/Packages/Network/Runtime/ModuleData/DataRequestPost.cs.meta similarity index 100% rename from Packages/Network/Runtime/DataRequestPost.cs.meta rename to Packages/Network/Runtime/ModuleData/DataRequestPost.cs.meta diff --git a/Packages/Network/Runtime/ModuleData/DataRequestTexture.cs b/Packages/Network/Runtime/ModuleData/DataRequestTexture.cs new file mode 100644 index 0000000..a5e7c42 --- /dev/null +++ b/Packages/Network/Runtime/ModuleData/DataRequestTexture.cs @@ -0,0 +1,90 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.Networking; + +namespace MuHua { + /// + /// Get下载 Texture + /// + public class DataRequestTexture : DataRequest { + public readonly string url; + + public Action OnError; + public Action OnCallback; + public bool isCompress; + + public override string Url => url; + public override EnumNetworkRequestType RequestType => EnumNetworkRequestType.Texture; + + /// Web Get请求 Texture + public DataRequestTexture(string url, Action OnCallback = null, bool isCompress = true) { + this.url = url; + this.OnCallback = OnCallback; + this.isCompress = isCompress; + } + + public override void RequestResultHandle(bool isDone, UnityWebRequest web) { + // 检查请求是否完成且没有错误 + if (!isDone) { + OnError?.Invoke($"Texture download failed: {web.error}"); + return; + } + // 检查下载处理程序是否为 DownloadHandlerTexture + DownloadHandlerTexture downloadHandler = web.downloadHandler as DownloadHandlerTexture; + if (downloadHandler == null || downloadHandler.texture == null) { + OnError?.Invoke("Failed to load Texture."); + return; + } + // 获取纹理,并进行压缩 + Texture2D texture = downloadHandler.texture; + if (isCompress) { + bool compress = (texture.width % 2) == 0 && (texture.height % 2) == 0; + if (compress) { texture.Compress(true); } + else { Debug.LogWarning($"Unable to compress image: {web.url}"); } + } + // 获取纹理大小并打印 + string textureSize = GetTextureMemorySize(texture); + Debug.Log($"Texture size: {textureSize}"); + OnCallback?.Invoke(texture); + } + + public static string GetTextureMemorySize(Texture2D texture) { + if (texture == null) return "0 B"; + + // 获取纹理的宽度、高度和格式 + int width = texture.width; + int height = texture.height; + TextureFormat format = texture.format; + + // 每像素的字节数 + int bytesPerPixel = 0; + switch (format) { + case TextureFormat.Alpha8: bytesPerPixel = 1; break; + case TextureFormat.RGB24: bytesPerPixel = 3; break; + case TextureFormat.RGBA32: bytesPerPixel = 4; break; + case TextureFormat.ARGB32: bytesPerPixel = 4; break; + case TextureFormat.RGBAHalf: bytesPerPixel = 8; break; + case TextureFormat.RGBAFloat: bytesPerPixel = 16; break; + default: + Debug.LogWarning($"Unsupported texture format: {format}"); + return "Unknown Size"; + } + + // 计算纹理占用的内存大小(字节) + long memorySizeBytes = width * height * bytesPerPixel; + + // 转换为 KB 或 MB + if (memorySizeBytes < 1024) { + return $"{memorySizeBytes} B"; + } + else if (memorySizeBytes < 1024 * 1024) { + return $"{(memorySizeBytes / 1024f):F2} KB"; + } + else { + return $"{(memorySizeBytes / (1024f * 1024f)):F2} MB"; + } + } + } +} \ No newline at end of file diff --git a/Packages/Network/Runtime/DataRequestTexture.cs.meta b/Packages/Network/Runtime/ModuleData/DataRequestTexture.cs.meta similarity index 100% rename from Packages/Network/Runtime/DataRequestTexture.cs.meta rename to Packages/Network/Runtime/ModuleData/DataRequestTexture.cs.meta diff --git a/Packages/Network/Runtime/ModuleEnum.meta b/Packages/Network/Runtime/ModuleEnum.meta new file mode 100644 index 0000000..5173b30 --- /dev/null +++ b/Packages/Network/Runtime/ModuleEnum.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e9e5e26603d72f24ba9552d00b246bf3 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Network/Runtime/WebRequestType.cs b/Packages/Network/Runtime/ModuleEnum/EnumNetworkRequestType.cs similarity index 76% rename from Packages/Network/Runtime/WebRequestType.cs rename to Packages/Network/Runtime/ModuleEnum/EnumNetworkRequestType.cs index e78930d..4642cb0 100644 --- a/Packages/Network/Runtime/WebRequestType.cs +++ b/Packages/Network/Runtime/ModuleEnum/EnumNetworkRequestType.cs @@ -6,7 +6,7 @@ namespace MuHua { /// /// Web请求类型 /// - public enum WebRequestType { + public enum EnumNetworkRequestType { /// GET GET = 0, /// POST 表单 @@ -14,6 +14,8 @@ namespace MuHua { /// POST Json PostJson = 2, /// GET 获取图片 - Texture = 3 + Texture = 3, + /// GET 获取音频 + Audio = 4 } } \ No newline at end of file diff --git a/Packages/Network/Runtime/WebRequestType.cs.meta b/Packages/Network/Runtime/ModuleEnum/EnumNetworkRequestType.cs.meta similarity index 100% rename from Packages/Network/Runtime/WebRequestType.cs.meta rename to Packages/Network/Runtime/ModuleEnum/EnumNetworkRequestType.cs.meta diff --git a/Packages/Network/Runtime/ModuleNetwork.meta b/Packages/Network/Runtime/ModuleNetwork.meta new file mode 100644 index 0000000..563413f --- /dev/null +++ b/Packages/Network/Runtime/ModuleNetwork.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8ffb8f1efd4ef5547bcb507cb77cc43a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Network/Runtime/WebRequest.cs b/Packages/Network/Runtime/ModuleNetwork/NetworkRequest.cs similarity index 65% rename from Packages/Network/Runtime/WebRequest.cs rename to Packages/Network/Runtime/ModuleNetwork/NetworkRequest.cs index 2b345c0..67ad533 100644 --- a/Packages/Network/Runtime/WebRequest.cs +++ b/Packages/Network/Runtime/ModuleNetwork/NetworkRequest.cs @@ -7,13 +7,14 @@ namespace MuHua { /// /// 协程网络请求 /// - public static class WebRequest { + public static class NetworkRequest { /// 发送请求 public static IEnumerator Execute(DataRequest request) { - if (request.RequestType == WebRequestType.GET) { yield return Get(request); } - if (request.RequestType == WebRequestType.PostForm) { yield return PostForm(request); } - if (request.RequestType == WebRequestType.PostJson) { yield return PostJson(request); } - if (request.RequestType == WebRequestType.Texture) { yield return Texture(request); } + if (request.RequestType == EnumNetworkRequestType.GET) { yield return Get(request); } + if (request.RequestType == EnumNetworkRequestType.PostForm) { yield return PostForm(request); } + if (request.RequestType == EnumNetworkRequestType.PostJson) { yield return PostJson(request); } + if (request.RequestType == EnumNetworkRequestType.Texture) { yield return Texture(request); } + if (request.RequestType == EnumNetworkRequestType.Audio) { yield return Audio(request); } } public static IEnumerator Get(DataRequest request) { string url = request.Url; @@ -37,7 +38,7 @@ namespace MuHua { #if UNITY_2022 using UnityWebRequest web = UnityWebRequest.PostWwwForm(url, "POST"); #else - using UnityWebRequest web = UnityWebRequest.Post(url, "POST"); + using UnityWebRequest web = UnityWebRequest.Post(url, "POST"); #endif web.uploadHandler.Dispose(); web.uploadHandler = new UploadHandlerRaw(postBytes); @@ -54,5 +55,13 @@ namespace MuHua { bool isDone = web.isDone && web.result == UnityWebRequest.Result.Success; request.RequestResultHandle(isDone, web); } + /// 下载音频 + public static IEnumerator Audio(DataRequest request) { + string url = request.Url; + using UnityWebRequest web = UnityWebRequestMultimedia.GetAudioClip(url, AudioType.UNKNOWN); // 自动检测音频类型 + yield return web.SendWebRequest(); + bool isDone = web.isDone && web.result == UnityWebRequest.Result.Success; + request.RequestResultHandle(isDone, web); + } } } diff --git a/Packages/Network/Runtime/WebRequest.cs.meta b/Packages/Network/Runtime/ModuleNetwork/NetworkRequest.cs.meta similarity index 100% rename from Packages/Network/Runtime/WebRequest.cs.meta rename to Packages/Network/Runtime/ModuleNetwork/NetworkRequest.cs.meta diff --git a/Packages/Network/Runtime/WebRequestAsync.cs b/Packages/Network/Runtime/ModuleNetwork/NetworkRequestAsync.cs similarity index 70% rename from Packages/Network/Runtime/WebRequestAsync.cs rename to Packages/Network/Runtime/ModuleNetwork/NetworkRequestAsync.cs index f680e78..c890726 100644 --- a/Packages/Network/Runtime/WebRequestAsync.cs +++ b/Packages/Network/Runtime/ModuleNetwork/NetworkRequestAsync.cs @@ -10,13 +10,14 @@ namespace MuHua { /// /// 异步网络请求 /// - public static class WebRequestAsync { + public static class NetworkRequestAsync { /// 发送请求 public static void Execute(DataRequest request) { - if (request.RequestType == WebRequestType.GET) { Get(request); } - if (request.RequestType == WebRequestType.PostForm) { PostForm(request); } - if (request.RequestType == WebRequestType.PostJson) { PostJson(request); } - if (request.RequestType == WebRequestType.Texture) { Texture(request); } + if (request.RequestType == EnumNetworkRequestType.GET) { Get(request); } + if (request.RequestType == EnumNetworkRequestType.PostForm) { PostForm(request); } + if (request.RequestType == EnumNetworkRequestType.PostJson) { PostJson(request); } + if (request.RequestType == EnumNetworkRequestType.Texture) { Texture(request); } + if (request.RequestType == EnumNetworkRequestType.Audio) { Audio(request); } } public static async void Get(DataRequest request) { string url = request.Url; @@ -40,7 +41,7 @@ namespace MuHua { #if UNITY_2022 using UnityWebRequest web = UnityWebRequest.PostWwwForm(url, "POST"); #else - using UnityWebRequest web = UnityWebRequest.Post(url, "POST"); + using UnityWebRequest web = UnityWebRequest.Post(url, "POST"); #endif web.uploadHandler.Dispose(); web.uploadHandler = new UploadHandlerRaw(postBytes); @@ -57,6 +58,14 @@ namespace MuHua { bool isDone = web.isDone && web.result == UnityWebRequest.Result.Success; request.RequestResultHandle(isDone, web); } + /// 下载音频 + public static async void Audio(DataRequest request) { + string url = request.Url; + using UnityWebRequest web = UnityWebRequestMultimedia.GetAudioClip(url, AudioType.UNKNOWN); // 自动检测音频类型 + await web.SendWebRequest(); + bool isDone = web.isDone && web.result == UnityWebRequest.Result.Success; + request.RequestResultHandle(isDone, web); + } public static TaskAwaiter GetAwaiter(this UnityWebRequestAsyncOperation op) { var tcs = new TaskCompletionSource(); op.completed += (obj) => { tcs.SetResult(null); }; diff --git a/Packages/Network/Runtime/WebRequestAsync.cs.meta b/Packages/Network/Runtime/ModuleNetwork/NetworkRequestAsync.cs.meta similarity index 100% rename from Packages/Network/Runtime/WebRequestAsync.cs.meta rename to Packages/Network/Runtime/ModuleNetwork/NetworkRequestAsync.cs.meta