示例工程【免费下载链接】Unity3DTraining【Unity杂货铺】unity大杂烩~项目地址https://gitcode.com/gh_mirrors/un/Unity3DTraining点击查看免费下载导读本文围绕 Unity3DTraining 仓库中NetWorkAndResources目录下的网络与资源数据操作练习展开系统讲解 Unity 客户端开发中最常用的四类数据能力基于WWW类的 GET/POST 请求与资源上传下载、JSON 数据解析与存储、移动平台外部文件的动态读取以及基于 Socket Protobuf 的可靠通信与 TCP 拆包粘包处理。文中所有示例均来自仓库内可直接运行的真实工程WebTest、JsonDataDemo、MobilePlatformDynamicReadExternalFiles、SampleSocket、Socket_Protobuff读者可对照源码逐步验证掌握一套可直接迁移到实际项目的网络层与数据层开发方案。一、练习总览网络与资源数据操作的知识地图NetWorkAndResources/README.md 是该主题的入口索引它把 Unity 网络与资源数据操作拆解为若干可独立练习的工程与知识点仓库内对应的核心工程如下主题仓库工程覆盖能力HTTP 请求与资源传输WebTestGET/POST 提交数据、图片上传下载、音频下载JSON 解析与存储JsonDataDemo官方 JsonUtility 与开源 LitJson 双方案移动平台文件读取MobilePlatformDynamicReadExternalFilesResources / StreamingAssets / persistentDataPath / AssetBundleSocket 网络通信SampleSocket、Socket_ProtobuffSocket 框架、Protobuf 编解码、拆包粘包断包处理索引中同时整理了理论支撑资料TCP/IP 总结、粘包拆包方案、帧同步与状态同步、select/poll/epoll 等可作为实践之余的原理补充。本文以下各节将逐一深入这些工程把「索引 → 源码 → 原理」串成一条可复现的学习路径。二、基于 WWW 类的 HTTP 通信与资源传输WebTestWebTest 是一个「网络相关练习」工程核心目标包括使用 GET/POST 方法提交数据并接收服务器响应、图片的上传与下载、音乐的下载。其全部逻辑集中在 WebManager.cs 一个脚本中通过OnGUI提供交互按钮非常适合在编辑器或真机上直接观察网络行为。2.1 GET 请求携带参数访问服务器GET 请求把参数拼接在 URL 上核心代码如下//GET请求 IEnumerator IGetData () { //使用Get方法访问Http地址 WWW www new WWW (http://127.0.0.1/Test/Test.php?usernamegetpassword12345); //等待服务器响应 yield return www; //如果出现错误 if (www.error ! null) { m_info www.error; yield return null; } //获取服务器的响应文本 m_info www.text; }要点解读请求格式usernamegetpassword12345直接以查询字符串形式拼接到 URL 末尾服务器端通过$_GET即可取参错误处理www.error非空表示请求失败此时应读取错误信息而非继续使用www.text响应读取www.text拿到服务器返回的文本如 JSON、HTML。2.2 POST 请求表单数据提交POST 请求将参数放入请求体需要显式构造请求头与字节数据//POST请求 IEnumerator IPostData () { Dictionarystring,string headers new Dictionarystring, string (); headers.Add (Content-Type, application/x-www-form-urlencoded); //将要发送的Post文本 string data usernamepostpassword6789; //将文本转为byte[] byte[] bs System.Text.UTF8Encoding.UTF8.GetBytes (data); //向Http服务器提交post数据 WWW www new WWW (http://127.0.0.1/Test/test.php, bs, headers); //等待服务器响应 yield return www; if (www.error ! null) { m_info www.error; yield return null; } m_info www.text; }要点解读Content-Type表单提交必须声明application/x-www-form-urlencoded否则服务器可能无法正确解析请求体编码转换WWW的字节重载要求数据以byte[]形式传入UTF8Encoding.UTF8.GetBytes保证中文等字符按 UTF-8 正确编码构造签名new WWW(url, postData, headers)是 WWW 家族中最常用的 POST 形式。2.3 图片上传与下载二进制数据的处理图片上传先把Texture2D编码为 PNG 字节流再用WWWForm以 multipart/form-data 形式提交下载则直接把响应的www.texture还原为纹理//获取图片 IEnumerator IRequestPNG () { //将图片读入byte数组 byte[] bs m_uploadImage.EncodeToPNG (); //创建WWWForm WWWForm form new WWWForm (); //添加二进制的Post数据 form.AddBinaryData (picture, bs, screenshot, image/png); //向服务器提交二进制的Post数据 WWW www new WWW (http://127.0.0.1/Test/Test.php, form); //等待服务器响应 yield return www; if (www.error ! null) { m_info www.error; yield return null; } //收到服务器返回图片数据 m_downloadTexture www.texture; }AddBinaryData的四个参数分别是字段名picture、二进制数据、提交文件名screenshot、MIME 类型image/png。服务器端按普通文件上传接收后可以回传处理结果如生成的新图客户端用www.texture直接解码为Texture2D。2.4 音频下载与播放音频下载与图片类似www.GetAudioClip(false)从响应流中解码出AudioClip配合AudioSource.PlayOneShot即可播放//下载声音 IEnumerator DownloadSound () { //下载一个声音文件 WWW www new WWW (http://127.0.0.1/Test/music.wav); yield return www; if (www.error ! null) { m_info www.error; yield return null; } //获得服务器返回的声音文件 m_downloadClip www.GetAudioClip (false); //播放声音 GetComponentAudioSource().PlayOneShot (m_downloadClip); }从 WebManager.cs 可以看到工程在Start()中即发起音乐下载运行时点击 Get Data、Post Data、Request Image 三个按钮即可分别触发上述请求。这套代码完整覆盖了「文本请求 二进制上传 二进制下载」三种最常见的数据形态是后续迁移到UnityWebRequest前理解 Unity 网络模型的最佳起点。三、JSON 数据解析与存储JsonDataDemoJsonDataDemo 同时演示了 Unity 官方序列化器JsonUtility与开源库LitJson两种方案工程内已打包 LitJson.dll并提供了两份场景JsonUtilityDemo.unity与LitjsonDemo.unity。3.1 示例数据面板配置表待解析的 JsonData.json 是一个典型的 UI 面板配置表结构为「对象 → infoList 数组 → 若干面板对象」{ infoList: [ { panelTypeString: ItemMessage, path: UIPanel/ItemMessagePanel }, { panelTypeString: Knapsack, path: UIPanel/KnapsackPanel }, { panelTypeString: MainMenu, path: UIPanel/MainMenuPanel }, { panelTypeString: Shop, path: UIPanel/ShopPanel }, { panelTypeString: Skill, path: UIPanel/SkillPanel }, { panelTypeString: System, path: UIPanel/SystemPanel }, { panelTypeString: Task, path: UIPanel/TaskPanel } ] }对应地工程定义了 JsonObjectModel.cs外层对象与 JsonArrayModel.cs数组元素两个模型类字段名与 JSON 键名一一对应这是所有 JSON 反序列化的前提。3.2 JsonUtility官方零依赖方案JsonUtilityTest.cs 演示了最基础的序列化/反序列化循环//序列化 Person person new Person(); person.name Jack; person.age 12; string jsonString JsonUtility.ToJson(person); Debug.Log(jsonString); //反序列化 Person p1 JsonUtility.FromJsonPerson(jsonString); Debug.Log(p1.name : p1.age);从 JsonUtilityTest.cs 可以看到模型类Person被标注了[SerializeField]——这是JsonUtility的一个重要约束它基于 Unity 序列化系统因此只支持 public 字段与标记了[SerializeField]的私有字段不支持 Dictionary、不支持属性Property。注释掉的PersonList部分展示了嵌套数组对象Person[]的序列化方式说明多级结构需通过「外层类包含数组字段」来建模。JsonUtility的优点是免依赖、性能好缺点是对复杂 JSON 支持较弱。3.3 LitJson通用 JSON 解析方案JsonDeserialize.cs 展示了 LitJson 的四种典型用法代码中四段分别对应1强类型反序列化JsonMapper.ToObjectJsonObjectModel(jsonText.text)将文本直接映射为自定义模型随后遍历jsonObject.infoList输出每个面板的panelTypeString与path——这是游戏配置表加载最常用的方式。2弱类型 JsonData 遍历JsonMapper.ToObject(text)返回JsonData对象可动态查询Count元素个数、IsArray、IsObject、Keys等属性并通过jsonData[infoList]按下标访问适合 JSON 结构不确定的场景。3JsonData 动态构造通过data2[name] peiandsky逐层赋值即可构建嵌套对象再调用ToJson()输出字符串工程注释中还保留了「对象中嵌套对象」的写法data2[info][sex] male演示了任意深度结构的动态生成。4流式读写JsonReader逐 Token 读取reader.Read()循环可打印reader.Token与reader.ValueJsonWriter按顺序写WriteArrayStart / Write / WriteObjectStart / WritePropertyName / WriteObjectEnd / WriteArrayEnd最终输出类似[1,2,3,{color:blue}]的 JSON 文本。流式 API 适合处理大文本或自定义序列化流程。工程运行后将依次打印强类型遍历结果、JsonData的元信息Count、IsArray、IsObject、Keys 等、动态构造的 JSON 字符串与 JsonWriter 产物全部可在 Console 面板直接验证。四、Unity3D 移动平台动态读取外部文件全解析MobilePlatformDynamicReadExternalFiles 完整解答了移动端Android/iOS「外部文件放哪里、怎么读」的问题。工程提供Demo.unity与Demo1.unity两个场景分别对应 XMLReader.csResources 方案与 XMLReaderStreaming.csStreamingAssets 方案另有 AssetBunbleReader.cs 演示通过 AssetBundle 读取配置。4.1 路径体系四大关键位置移动平台与 PC 最大的差异在于不存在固定的本地文件系统路径Unity 因此提供了一套跨平台路径 API路径用途读取方式是否可写Application.dataPath工程数据目录只读直接File读取否Application.streamingAssetsPath随包发布的原始文件目录必须用 WWW/UnityWebRequestAndroid 上位于压缩包内否Application.persistentDataPath持久化可写目录直接File读写是Resources目录随包资源Resources.LoadT()否4.2 Resources 方案同步加载XMLReader.cs 演示了最简单的读取——把Test.xml放入Assets/Resources后同步加载private void LoadXML() { result Resources.LoadTextAsset(Test).ToString(); XmlDocument xmlReader new XmlDocument(); xmlReader.LoadXml(result); }Resources.LoadTextAsset(Test)按文件名不含扩展名加载文本资源随后交给System.Xml.XmlDocument解析。这种方式在 Android/iOS 上行为一致适合少量、随包发布的只读配置。4.3 StreamingAssets 方案必须走 WWWStreamingAssets 在 Android 上位于 APK 的压缩包内部无法用File类直接访问必须通过 WWW 读取。这一点在源码注释中被特别强调/// summary /// 如前文所述streamingAssets只能使用www来读取 /// 如果不是使用www来读取的同学就不要问为啥读不到streamingAssets下的内容了。 /// 这里还可以使用persistenDataPath来保存从streamingassets那里读到内容。 /// /summary IEnumerator LoadXML() { string sPath file:// Application.streamingAssetsPath /Test.xml; WWW www new WWW(sPath); yield return www; _result www.text; text.text _result; }注意两点工程细节一是路径必须以file://协议前缀开头iOS 上还需注意Application.streamingAssetsPath可能带空格或中文必要时先WWW.EscapeURL处理二是注释明确指出——从 StreamingAssets 读到的内容应主动写入persistentDataPath保存这是「首次启动拷贝配置 → 后续增量更新」这一移动端常见方案的雏形。4.4 AssetBundle 方案可更新的配置文件AssetBunbleReader.cs 演示了将配置打包进 AssetBundle 再动态加载的完整链路string str Application.streamingAssetsPath / TestXML.bundle; WWW www new WWW(str); www WWW.LoadFromCacheOrDownload(str, 0); AssetBundleCsv www.assetBundle; string path Test; TextAsset test AssetBundleCsv.Load(path, typeof(TextAsset)) as TextAsset; _result test.ToString();WWW.LoadFromCacheOrDownload(url, version)是旧版 Unity 的 AB 缓存加载接口version 0表示使用默认缓存版本加载后用assetBundle.Load(Test, typeof(TextAsset))取出包内的TextAsset。这个模式的价值在于AssetBundle 文件可以独立于安装包更新服务器推送新 bundle 即可实现配置热更——它与 HotUpdate 目录下的 AssetBundle 框架配合构成完整的热更新链路。实际工程中建议以UnityWebRequestAssetBundle替代已废弃的 WWW 版本但「bundle 命名 → 版本号 → 缓存 → 资源加载」的流程骨架完全相同。4.5 三种方案的选择建议纯随包只读配置优先Resources简单可靠需要与包体解耦、可独立更新的资源用StreamingAssetspersistentDataPath拷贝或直接上 AssetBundle运行期产生的数据存档、下载缓存、日志一律写persistentDataPath它是唯一跨平台保证可写的目录。五、Socket 网络模块框架、Protobuf 与拆包粘包SampleSocket / Socket_Protobuff网络编程是移动游戏的必修课。SampleSocket 与 Socket_Protobuff 两个工程分别演示了「自研 Socket 框架 protobuf-net」与「Google.Protobuf 模块化客户端」两代实现。5.1 SampleSocket完整 Socket 框架剖析SampleSocket 的说明文档与目录结构表明这是一套「超级详细完整、上线项目中稳定使用」的 Socket 模块核心脚本位于 Socket/Assets/Scripts/Socket 下关键组成如下文件职责SocketManager.csSocket 连接、收发调度ByteStreamBuff.cs / DataBuff.cs字节流缓冲与数据包缓冲负责拆包MessageCenter.cs消息注册与分发ProtocalDefinition.cs协议号定义protobuf/ 目录内置 protobuf-net 运行时Meta、Serializers、Compiler 等工程的协议生成管线在 ProtoGen 目录用.proto文件定义消息如 protocal_loginserver.proto通过 BuildCS.bat 调用protogen.exe配合protobuf-net.dll一键生成 C# 协议类生成的 protocal_loginserver.cs 直接放入工程使用。客户端 Client.cs 与服务器端 Server.cs 位于同一工程可单机跑通完整收发闭环。工程还提供了框架流程图 Socket框架流程图.png直观展示「接收缓冲区 → 数据包解析 → 消息中心分发 → 逻辑层处理」的完整链路推荐在阅读源码前先对照流程图建立整体认知。5.2 Socket_ProtobuffGoogle.Protobuf 模块化实现Socket_Protobuff 采用官方Google.Protobuf运行时完整源码位于 Assets/Plugins/Google.Protobuf架构比 SampleSocket 更模块化Socket/SocketClient.cs底层连接与收发Socket/SocketManager.cs连接管理与对外接口Socket/SocketMono.cs挂载在场景对象上驱动主线程循环Socket/ProtobufEncoding.cs消息的编码/解码Socket/Proto/ProtoDic.cs协议号 ↔ 消息类型的映射表Socket/Modules/Heart心跳模块用于探测与保活连接Scripts/Demo/Demo.cs收发演示。协议定义在 Proto/msg.proto配套的 GenProto.bat 与 GenCSCode.cmd 通过内置的protoc.exe生成 C# 消息类Msg.cs。工程包含完整的 DEMO.unity 场景运行即可验证收发与心跳。5.3 TCP 粘包拆包网络层必须解决的问题TCP 是字节流协议不存在消息边界因此多个数据包可能粘连粘包或一个包被截断断包/半包。无论 SampleSocket 的ByteStreamBuff/DataBuff还是 Socket_Protobuff 的消息编码层其本质都是在解决同一问题——从字节流中准确切分出完整协议包通用方案有两种定长包每个包固定字节数按长度切分最简单但浪费带宽变长包常用包头固定字段「包体长度 协议号」包体为 Protobuf 二进制。收包时维护缓冲区while (缓冲区内可读长度 包头长度)就解析出包体长度缓冲区内可读长度 包头 包体长度时取整包处理、移除已消费字节如此循环直到缓冲不足为止——这正是两个工程缓冲类的核心逻辑。NetWorkAndResources索引中同时收录了 TCP 粘包拆包方案的专题文章与 Socket 编程原理资料配合上述工程源码可形成「理论 → 实现」的完整闭环。六、从 WWW 到 UnityWebRequest练习成果的工程化迁移仓库练习基于经典的WWW类它在 Unity 5.x 时代是标准方案现代 Unity2018已全面转向 UnityWebRequestWWW 已标记为过时。两者的对应关系如下便于读者迁移练习能力WWW 写法UnityWebRequest 写法GET 文本new WWW(url)UnityWebRequest.Get(url)POST 表单new WWW(url, bs, headers)UnityWebRequest.Post(url, form)图片上传WWWForm.AddBinaryData同样支持WWWFormmultipart/form-data图片下载www.textureDownloadHandlerTexture.GetContent(req)音频下载www.GetAudioClip()DownloadHandlerAudioClip.GetContent(req)AB 加载WWW.LoadFromCacheOrDownloadUnityWebRequestAssetBundle.GetAssetBundle迁移时保持三要素不变URL 构造、请求头/表单、异步等待后的错误与数据读取——本文第二节的每一段协程都可以按上表一一对应改写业务逻辑无需大动。七、练习清单与延伸方向综合 NetWorkAndResources/README.md 的索引与仓库工程推荐按以下顺序完成练习HTTP 层跑通 WebTest依次验证 GET、POST、图片上传下载、音频下载四个按钮数据层跑通 JsonDataDemo对比 JsonUtility 与 LitJson 在「配置表反序列化」「动态构造 JSON」场景的差异文件层跑通 MobilePlatformDynamicReadExternalFiles在真机上验证 Resources / StreamingAssets / persistentDataPath 三路径差异通信层跑通 SampleSocketprotobuf-net与 Socket_ProtobuffGoogle.Protobuf重点理解缓冲区的拆包逻辑与心跳保活理论深化结合索引中的 TCP/IP、粘包拆包、帧同步/状态同步等资料把实现沉淀为原理认知。需要说明的是仓库工程基于较早的 Unity 版本ProjectVersion.txt与ProjectSettings可查部分 API如WWW、LoadFromCacheOrDownload在新版本中已过时练习时建议先在目标 Unity 版本中确认 API 可用性再按第六节表格迁移到UnityWebRequest同时注意不同平台的路径差异尤其是 Android 的 StreamingAssets 必须走 WWW/UnityWebRequest 读取。上述全部源码均可在仓库对应目录中直接查阅与运行适合作为 Unity 客户端开发者的网络与数据层实训手册。赞分享示例工程【免费下载链接】Unity3DTraining【Unity杂货铺】unity大杂烩~项目地址https://gitcode.com/gh_mirrors/un/Unity3DTraining点击查看免费下载相关推荐slideout移动端网络优化减少请求与数据传输slideout移动端网络优化减少请求与数据传输 你还在为移动端网页加载缓慢而烦恼吗本文将聚焦slideout移动端网络优化通过减少请求与数据传输提升用前端UI组件lowcode-engine Demo 数据源 API 实战指南请求、读取与更新数据源lowcode engine Demo 数据源 API 实战指南请求、读取与更新数据源 本篇指南以 lowcode engine 官方 Demo 使用文档 d前端低代码Mantl CI/CD集成构建现代化自动化部署流程的终极指南Mantl CI/CD集成构建现代化自动化部署流程的终极指南 想要快速构建企业级的CI/CD流水线吗Mantl作为现代化的分布式服务平台提供了完整的自动化上一篇如何用DiffSynth Studio打造AI农业助手从作物生长模拟到病虫害识别全流程指南下一篇揭秘Popcorn Time资源搜索如何精准找到你想看的内容创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
微网低碳经济调度:改进粒子群算法与碳捕集多时间尺度优化 做微网低碳经济调度这个方向有一段时间了,最初接触这个题目是因为一个含碳捕集元件的微网研究项目,核心诉求就一句话:在保证供电可靠性的前提下,把碳排放和运行成本一起压下来。这个问题的难点其实不在“优化”本身,而… · 2026/9/25 3:03:46
vinext 并发请求隔离架构解析:基于 AsyncLocalStorage 的两层作用域模型 后端Web框架SSR 【免费下载链接】vinext Vite plugin that reimplements the Next.js API surface — deploy anywhere 项目地址: https://gitcode.com/gh_mirrors/vi/vinext 点击查看 免费下载 导读
本文深入讲解 vinext(一个可部署到任意平台的 Vite… · 2026/9/25 3:03:46
Hypothesis 发布说明写作指南:从 RELEASE.rst 模板到自动化发布管线 测试开发工具 【免费下载链接】hypothesis The property-based testing library for Python 项目地址: https://gitcode.com/gh_mirrors/hy/hypothesis 点击查看 免费下载 导读
Hypothesis 是一个基于属性的 Python 测试库,其持续交付依赖一套严格的&q… · 2026/9/25 4:24:11
学生选课管理信息系统课设:SCDB表设计与SQL事务实现要点 简介:面向学生选课管理的信息系统课程设计报告,模拟了选课业务中的主要管理环节:学生入校注册后统一记录基本信息,课程库维护每门课程的开设信息,教师最多可主讲三门课程,学生选课后将选课记录写入数据库&a… · 2026/9/25 4:24:05
从零实现AES加密引擎:zip4cj的S盒、T表与AES-CTR模式深度剖析 从零实现AES加密引擎:zip4cj的S盒、T表与AES-CTR模式深度剖析 【免费下载链接】zip4cj 一个用于创建和解压ZIP压缩格式的库 项目地址: https://gitcode.com/Cangjie-TPC/zip4cj
🔐 zip4cj 是一个基于仓颉语言(Cangjie)实现… · 2026/9/25 4:24:05
数据库课程设计:进销存系统中的事务、范式与并发控制实战 简介:本资源是一份面向高校计算机与信息管理专业学生的数据库课程设计实战材料,聚焦商店进销存管理系统的完整开发实践,助力初学者掌握数据库建模、SQL编程与系统分析全流程。压缩包共3个文件(704KB),含SQL… · 2026/9/25 4:23:59
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37