{"id":21358851,"url":"https://github.com/gameframex/com.gameframex.unity.web","last_synced_at":"2026-03-02T12:10:36.968Z","repository":{"id":232243251,"uuid":"783827561","full_name":"GameFrameX/com.gameframex.unity.web","owner":"GameFrameX","description":"GameFrameX是一款全面的集成式游戏开发框架，提供了从前端到后端的完整解决方案。该框架支持包括Unity、Cocos Creator、LayaBox、和Godot等多种主流游戏开发平台，确保开发者能够为不同的目标平台打造精美的游戏体验。","archived":false,"fork":false,"pushed_at":"2025-01-20T03:21:16.000Z","size":53,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-01-20T04:22:51.880Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://gameframex.doc.alianblank.com/","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/GameFrameX.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-04-08T16:45:19.000Z","updated_at":"2025-01-20T03:21:18.000Z","dependencies_parsed_at":"2024-07-23T11:57:57.180Z","dependency_job_id":"fe1dfd4e-b73a-46e4-98a1-7607c436a4f0","html_url":"https://github.com/GameFrameX/com.gameframex.unity.web","commit_stats":null,"previous_names":["alianblank/com.alianblank.gameframex.web","alianblank/com.alianblank.gameframex.unity.web","gameframex/com.gameframex.unity.web"],"tags_count":7,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GameFrameX%2Fcom.gameframex.unity.web","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GameFrameX%2Fcom.gameframex.unity.web/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GameFrameX%2Fcom.gameframex.unity.web/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GameFrameX%2Fcom.gameframex.unity.web/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/GameFrameX","download_url":"https://codeload.github.com/GameFrameX/com.gameframex.unity.web/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243830950,"owners_count":20354856,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-22T05:22:39.415Z","updated_at":"2026-03-02T12:10:36.962Z","avatar_url":"https://github.com/GameFrameX.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# GameFrameX Web 组件\n\n[![Unity Version](https://img.shields.io/badge/Unity-2019.4%2B-blue.svg)](https://unity3d.com)\n[![Version](https://img.shields.io/badge/version-1.1.8-green.svg)](package.json)\n[![License](https://img.shields.io/badge/license-MIT-orange.svg)](LICENSE.md)\n\nGameFrameX Web 组件是一个高性能的 Unity HTTP 网络请求库，提供简洁易用的 API 来处理各种网络请求场景。支持 GET、POST 请求，可处理字符串、JSON、二进制数据等多种格式。\n\n## ✨ 特性\n\n- 🚀 **高性能异步处理** - 基于 C# Task 异步模式，支持 async/await\n- 📦 **多数据格式支持** - 字符串、JSON、二进制数据、Protocol Buffers\n- 🌐 **跨平台兼容** - 支持 WebGL、PC、移动平台\n- ⚡ **连接池管理** - 智能连接复用，支持最大并发连接数控制\n- 🔒 **安全可靠** - 完善的错误处理和超时机制\n- 🛠️ **易于扩展** - 模块化设计，支持自定义数据序列化\n\n## 📦 安装\n\n### 通过 Git URL 安装（推荐）\n\n1. 在 Unity 编辑器中打开 Package Manager\n2. 点击 \"+\" 按钮选择 \"Add package from git URL\"\n3. 输入以下 URL：\n   ```\n   https://github.com/gameframex/com.gameframex.unity.web.git\n   ```\n\n### 通过 manifest.json 安装\n\n在项目的 `Packages/manifest.json` 文件中添加：\n\n```json\n{\n  \"dependencies\": {\n    \"com.gameframex.unity.web\": \"https://github.com/gameframex/com.gameframex.unity.web.git\",\n    \"com.gameframex.unity\": \"https://github.com/gameframex/com.gameframex.unity.git\"\n  }\n}\n```\n\n### 手动安装\n\n1. 下载最新版本发布包\n2. 解压到项目的 `Packages` 目录下\n3. Unity 会自动识别并加载包\n\n## 🚀 快速开始\n\n### 基本用法\n\n```csharp\nusing GameFrameX.Web.Runtime;\nusing System.Threading.Tasks;\nusing System.Collections.Generic;\n\npublic class WebExample : MonoBehaviour\n{\n    private IWebManager webManager;\n    \n    private async void Start()\n    {\n        // 获取 Web 管理器实例\n        webManager = GameFrameworkEntry.GetModule\u003cIWebManager\u003e();\n        \n        // 发送 GET 请求获取字符串\n        string result = await webManager.GetToString(\"https://api.example.com/data\");\n        Debug.Log(\"GET Response: \" + result);\n        \n        // 发送 POST 请求带表单数据\n        var formData = new Dictionary\u003cstring, string\u003e\n        {\n            { \"username\", \"testuser\" },\n            { \"password\", \"testpass\" }\n        };\n        \n        string postResult = await webManager.PostToString(\"https://api.example.com/login\", formData);\n        Debug.Log(\"POST Response: \" + postResult);\n    }\n}\n```\n\n### 使用 WebComponent（推荐）\n\n```csharp\nusing GameFrameX.Web.Runtime;\nusing System.Threading.Tasks;\nusing System.Collections.Generic;\n\npublic class MyWebService : MonoBehaviour\n{\n    private WebComponent webComponent;\n    \n    private void Awake()\n    {\n        webComponent = gameObject.GetOrAddComponent\u003cWebComponent\u003e();\n    }\n    \n    public async Task\u003cstring\u003e GetUserDataAsync(string userId)\n    {\n        var queryParams = new Dictionary\u003cstring, string\u003e\n        {\n            { \"userId\", userId }\n        };\n        \n        var headers = new Dictionary\u003cstring, string\u003e\n        {\n            { \"Authorization\", \"Bearer your-token-here\" }\n        };\n        \n        return await webComponent.GetToString(\n            \"https://api.example.com/users\", \n            queryParams, \n            headers\n        );\n    }\n    \n    public async Task\u003cbyte[]\u003e DownloadFileAsync(string fileUrl)\n    {\n        return await webComponent.GetToBytes(fileUrl);\n    }\n}\n```\n\n## 📚 API 参考\n\n### 核心接口：IWebManager\n\n#### GET 请求\n\n```csharp\n// 获取字符串响应\nTask\u003cstring\u003e GetToString(string url);\nTask\u003cstring\u003e GetToString(string url, Dictionary\u003cstring, string\u003e queryString);\nTask\u003cstring\u003e GetToString(string url, Dictionary\u003cstring, string\u003e queryString, Dictionary\u003cstring, string\u003e header);\n\n// 获取字节数组响应\nTask\u003cbyte[]\u003e GetToBytes(string url);\nTask\u003cbyte[]\u003e GetToBytes(string url, Dictionary\u003cstring, string\u003e queryString);\nTask\u003cbyte[]\u003e GetToBytes(string url, Dictionary\u003cstring, string\u003e queryString, Dictionary\u003cstring, string\u003e header);\n```\n\n#### POST 请求\n\n```csharp\n// 表单 POST 请求\nTask\u003cstring\u003e PostToString(string url, Dictionary\u003cstring, string\u003e formData = null);\nTask\u003cstring\u003e PostToString(string url, Dictionary\u003cstring, string\u003e formData, Dictionary\u003cstring, string\u003e queryString);\nTask\u003cstring\u003e PostToString(string url, Dictionary\u003cstring, string\u003e formData, Dictionary\u003cstring, string\u003e queryString, Dictionary\u003cstring, string\u003e header);\n\nTask\u003cbyte[]\u003e PostToBytes(string url, Dictionary\u003cstring, string\u003e formData);\nTask\u003cbyte[]\u003e PostToBytes(string url, Dictionary\u003cstring, string\u003e formData, Dictionary\u003cstring, string\u003e queryString);\nTask\u003cbyte[]\u003e PostToBytes(string url, Dictionary\u003cstring, string\u003e formData, Dictionary\u003cstring, string\u003e queryString, Dictionary\u003cstring, string\u003e header);\n\n// 二进制数据 POST 请求\nTask\u003cWebBufferResult\u003e PostToBytes(string url, byte[] binaryData, Dictionary\u003cstring, string\u003e queryString, Dictionary\u003cstring, string\u003e header, object userData = null);\n```\n\n#### 高级功能\n\n```csharp\n// Protocol Buffers 支持\nTask\u003cT\u003e GetProtoBuf\u003cT\u003e(string url) where T : class, IExtensible;\nTask\u003cT\u003e PostProtoBuf\u003cT\u003e(string url, IExtensible requestData) where T : class, IExtensible;\n\n// JSON 支持（通过扩展方法）\nTask\u003cT\u003e GetJson\u003cT\u003e(string url);\nTask\u003cT\u003e PostJson\u003cT\u003e(string url, object data);\n```\n\n### 配置选项\n\n```csharp\n// 设置请求超时时间（默认：30秒）\nTimeSpan RequestTimeout { get; set; }\n\n// 设置最大并发连接数（默认：8）\nint MaxConnectionPerServer { get; set; }\n\n// 启用/禁用详细日志\nbool EnableWebLog { get; set; }\n```\n\n## 🔧 高级用法\n\n### 处理二进制数据上传\n\n```csharp\npublic async Task UploadBinaryDataAsync(byte[] fileData, string fileName)\n{\n    var webManager = GameFrameworkEntry.GetModule\u003cIWebManager\u003e();\n    \n    var queryParams = new Dictionary\u003cstring, string\u003e\n    {\n        { \"fileName\", fileName }\n    };\n    \n    var headers = new Dictionary\u003cstring, string\u003e\n    {\n        { \"Content-Type\", \"application/octet-stream\" },\n        { \"Authorization\", \"Bearer your-token\" }\n    };\n    \n    WebBufferResult result = await webManager.PostToBytes(\n        \"https://api.example.com/upload\", \n        fileData, \n        queryParams, \n        headers\n    );\n    \n    if (result.IsSuccess)\n    {\n        Debug.Log(\"Upload successful!\");\n        byte[] responseData = result.Data;\n        // 处理响应数据\n    }\n}\n```\n\n### 使用 Protocol Buffers\n\n```csharp\n[ProtoContract]\npublic class UserRequest\n{\n    [ProtoMember(1)]\n    public string UserId { get; set; }\n}\n\n[ProtoContract] \npublic class UserResponse\n{\n    [ProtoMember(1)]\n    public string UserName { get; set; }\n    \n    [ProtoMember(2)]\n    public string Email { get; set; }\n}\n\npublic async Task\u003cUserResponse\u003e GetUserProtoBufAsync(string userId)\n{\n    var request = new UserRequest { UserId = userId };\n    \n    // 使用扩展方法发送 Protocol Buffers 请求\n    return await webManager.PostProtoBuf\u003cUserResponse\u003e(\n        \"https://api.example.com/user/protobuf\", \n        request\n    );\n}\n```\n\n### 错误处理\n\n```csharp\npublic async Task\u003cstring\u003e SafeWebRequestAsync(string url)\n{\n    try\n    {\n        return await webManager.GetToString(url);\n    }\n    catch (WebException ex) when (ex.Status == WebExceptionStatus.Timeout)\n    {\n        Debug.LogError(\"请求超时: \" + ex.Message);\n        return null;\n    }\n    catch (IOException ex)\n    {\n        Debug.LogError(\"网络IO错误: \" + ex.Message);\n        return null;\n    }\n    catch (Exception ex)\n    {\n        Debug.LogError(\"请求失败: \" + ex.Message);\n        return null;\n    }\n}\n```\n\n## ⚙️ 配置\n\n### 在编辑器中配置\n\n1. 在 Unity 编辑器中打开 \"GameFrameX/Web\" 菜单\n2. 选择 \"Web Settings\"\n3. 配置以下选项：\n   - **Request Timeout**: 请求超时时间（秒）\n   - **Max Connections**: 最大并发连接数\n   - **Enable Logging**: 启用详细日志输出\n\n### 代码配置\n\n```csharp\nprivate void ConfigureWebManager()\n{\n    var webManager = GameFrameworkEntry.GetModule\u003cIWebManager\u003e();\n    \n    // 设置请求超时为 60 秒\n    webManager.RequestTimeout = TimeSpan.FromSeconds(60);\n    \n    // 设置最大并发连接数为 16\n    webManager.MaxConnectionPerServer = 16;\n    \n    // 启用详细日志\n    webManager.EnableWebLog = true;\n}\n```\n\n## 🐛 故障排除\n\n### 常见问题\n\n1. **WebGL 平台限制**\n   - WebGL 不支持多线程，所有请求都在主线程处理\n   - 建议使用 `await` 异步等待而不是阻塞调用\n\n2. **跨域问题 (CORS)**\n   - 确保服务器配置了正确的 CORS 头信息\n   - 对于 WebGL 构建，服务器必须支持 OPTIONS 预检请求\n\n3. **HTTPS 证书问题**\n   - 在移动设备上可能需要处理证书验证\n   - 可以使用自定义证书验证回调\n\n### 调试技巧\n\n```csharp\n// 启用详细调试日志\nwebManager.EnableWebLog = true;\n\n// 在 Player Settings 中启用 Development Build 和 Script Debugging\n// 这样可以获得更详细的错误信息\n```\n\n## 📋 版本历史\n\n查看 [CHANGELOG.md](CHANGELOG.md) 获取详细的版本更新信息。\n\n## 🤝 贡献\n\n欢迎提交 Issue 和 Pull Request！\n\n1. Fork 本项目\n2. 创建特性分支 (`git checkout -b feature/amazing-feature`)\n3. 提交更改 (`git commit -m 'Add some amazing feature'`)\n4. 推送到分支 (`git push origin feature/amazing-feature`)\n5. 创建 Pull Request\n\n## 📄 许可证\n\n本项目采用 MIT 许可证 - 查看 [LICENSE.md](LICENSE.md) 文件了解详情。\n\n## 🔗 相关链接\n\n- [GameFrameX 主项目](https://github.com/gameframex/com.gameframex.unity)\n- [官方文档](https://gameframex.doc.alianblank.com)\n- [示例项目](https://github.com/gameframex/com.gameframex.unity.examples)\n- [问题反馈](https://github.com/gameframex/com.gameframex.unity.web/issues)\n\n## 💬 支持\n\n如果你有任何问题或需要帮助，可以通过以下方式联系我们：\n\n- 📧 邮箱: alianblank@outlook.com\n- 🐛 [提交 Issue](https://github.com/gameframex/com.gameframex.unity.web/issues)\n- 📖 [查看文档](https://gameframex.doc.alianblank.com)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgameframex%2Fcom.gameframex.unity.web","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgameframex%2Fcom.gameframex.unity.web","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgameframex%2Fcom.gameframex.unity.web/lists"}