通过把StreamingAssets文件夹下的本地的资源MD5列表文件复制到persistentDataPath文件夹下和服务器上的进行对比,把有变化的资源更新替换到本地persistentDataPath文件夹,游戏在开始的时候,直接检查更新加载相应的资源。

StreamingAssets文件夹,可读,不可写,通过使用UnityWebRequest加载该文件夹下资源,其他方式无法加载里面的资源。

1.首先将StreamingAssets文件夹下资源复制到持久化路径里面。先加载出来,再通过FileStream类将数据写进去。

 UnityWebRequest www = UnityWebRequest.Get(path);yield return www.SendWebRequest();FileStream stream = new FileStream(newPath, FileMode.Create);stream.Write(www.downloadHandler.data, 0, www.downloadHandler.data.Length);//释放相关资源stream.Flush();stream.Close();}

2.游戏开始的时候,加载本地配置表和服务器上的作对比

public void CheckUpdate(){LOCAL_RES_PATH = "file:///" + Application.persistentDataPath + "/AssetBundles";LOCAL_RES_URL = "file:///" + Application.persistentDataPath + "/AssetBundles";Debug.Log("Checking Version Update......");     LocalResVersion = new Dictionary<string, string>();ServerResVersion = new Dictionary<string, string>();NeedDownFiles = new List<string>();StartCoroutine(LoadFile(LOCAL_RES_URL + VERSION_FILE, delegate (UnityWebRequest localVersion){Debug.Log("Loading Local VersionFile...");ParseVersionFile(localVersion.downloadHandler.text, LocalResVersion);StartCoroutine(this.LoadFile(SERVER_RES_URL + VERSION_FILE, delegate (UnityWebRequest serverVersion){Debug.Log("Loading Server VersionFile...");ParseVersionFile(serverVersion.downloadHandler.text, ServerResVersion);Debug.Log("File Comparison...");CompareVersion();DownLoadRes();}));}));}

这里在访问本地持久化路径的时候,一定要加上file前缀,不然不能正确的加载。

2.通过对比,分析需要从服务器更新的资源。

 foreach (var version in ServerResVersion){string fileName = version.Key;string serverMd5 = version.Value;           if (!LocalResVersion.ContainsKey(fileName)){NeedDownFiles.Add(fileName);}else{              string localMd5;LocalResVersion.TryGetValue(fileName, out localMd5);if (!serverMd5.Equals(localMd5)){NeedDownFiles.Add(fileName);}}}NeedUpdateLocalVersionFile = NeedDownFiles.Count > 0;

3.依次加载服务器上的资源,同时替换本地资源

 private void DownLoadRes(){if (NeedDownFiles.Count == 0){Debug.Log("Version Update Finish!!!");UpdateLocalVersionFile();UpdateComplete = true;return;}Debug.Log("DownLoading need Update File...");string file = NeedDownFiles[0];NeedDownFiles.RemoveAt(0);StartCoroutine(this.LoadFile(SERVER_RES_URL + file, delegate (UnityWebRequest w){//替换本地的资源ReplaceLocalRes(file, w.downloadHandler.data);DownLoadRes();}));}private void ReplaceLocalRes(string fileName, byte[] data){string filePath = LOCAL_RES_PATH + fileName;FileStream stream = new FileStream(Application.persistentDataPath+"/AssetBundles"+fileName, FileMode.Create);stream.Write(data, 0, data.Length);stream.Flush();stream.Close();}

4.等资源更新完毕,更新本地资源配置表,方便下次更新与服务器对比

  FileStream stream = new FileStream(Application.persistentDataPath+"/AssetBundles" + VERSION_FILE, FileMode.Create);byte[] data = Encoding.UTF8.GetBytes(versions.ToString());stream.Write(data, 0, data.Length);stream.Flush();stream.Close();Debug.Log("LocalFile Update  Finished!!!");

到这一步,基本上资源的更新就完毕了。

打包测试:遇到各种坑,因为在模拟器上测试,localhost 、127.0.0.1无法使用,出现UnknownError

后来有人说把地址换成10.0.2.2,就行了,但是因为使用的是夜神模拟器,换过之后还是不行,又换成了蓝叠,腾讯手游,网易mumu,测试通过,可以访问本地localhost,真的是恶心啊。

打AB的时候,demo之前在pc上测试是没有问题的,打包选项选的是Windows,然而我个笨蛋,在安卓模拟器上测试的时候,打包选项忘记改了,测试的时候,一直加载的是空的AB包,困扰了两天,路径也对,PC测试也没问题,咋就是NULLAB包,最后准备再次在PC上测试的时候,才发现打包选项忘记更改了。。。。WTF!!!

更改打包选项之后,测试正常。

之后再写一个代码逻辑的更新,使用XLua

Unity资源热更新相关推荐

  1. Unity资源热更新--资源管理、Addressable

    实习前理解错了mentor的意思,任务没完成TAT,火速学习一下addressable,另外狠狠吐槽北京健康宝弹窗. 资源打包方式 可热更资源类型:预制件.材质.贴图.模型.场景.shader.动画与 ...

  2. Addressable资源热更新疑问

    1)Addressable资源热更新疑问 ​2)如何解决远处网格线会花的问题 3)关于着色器中某些特殊图片的用途 4)Lightmap在内存中有重复加载 5)Unity Job System问题 这是 ...

  3. unity python热更新_Unity热更新介绍和测试方法

    最近项目中增加了热更新了功能,程序也完成了相应的开发,接下来就需要对这个模块进行相应的测试工作了,在测试开始之前,了解下其原理总是很有好处的. 1:什么是热更新 简单的理解就是:用户重启客户端就能实现 ...

  4. [Unity3D学习]Unity代码热更新 源码下载

    转载自:http://blog.gamerisker.com/archives/608.html 之前的一篇文章<[Unity3D学习]Unity代码热更新解决方案测试结果总结>只是说了一 ...

  5. 【Unity3D】基于AssetBundle实现资源热更新

    1 前言 Unity3D 本地资源一般放在 Resources 目录下,但是 Resouces 文件夹的大小不能超过 2G,使用 AssetBundle 管理资源可以解决 Resources 文件夹受 ...

  6. 【文集】Unity的热更新

    热更新对游戏很重要,但是unity自身是不支持热更新的,因此这方面还是有不少方案和文章 Unity热更新之LuaInterface(上篇) Unity热更新之LuaInterface(下篇) Lua ...

  7. Unity HybridCLR热更新技术实现

    最近我们在项目中遇到了一个问题:经常需要修改游戏逻辑,如果每次修改都需要重新打包发布,那将会非常耗时,于是我们开始寻找解决方案.最后我们找到了 Unity HybridCLR 热更新技术,实现了游戏逻 ...

  8. 关于uni-app的资源热更新!!!

    先看官方文档,对uni-app 的资源热更新有一个大致的了解: 整包升级 在线资源热更新 app方法 本文主要讲述,实现资源热更新时客户端需要进行的操作: 可以在***app.vue***的***on ...

  9. 【Unity】热更新插件【ULua】学习教程整理

    前言 IOS不能热更新,不是因为不能用反射,是因为 System.Reflection.Assembly.Load 无法使用 System.Reflection.Emit 无法使用 System.Co ...

最新文章

  1. Lightoj-1356 Prime Independence(质因子分解)(Hopcroft-Karp优化的最大匹配)
  2. Juint整合Log4j
  3. python signal模块作用_如何理解python中信号Signal?
  4. 计算机网络实验数据链路层分析,计算机网络第三次实验-数据链路层
  5. 查询排序_MySQL使用UNION连接两个查询排序失效
  6. linux中nm、ldd、readelf命令
  7. 社区团购真的是实体店终结者吗?
  8. 非专业人士观点(3)不要假如
  9. 抽象工厂模式类图及代码示例
  10. DC-DC升压芯片MP9185
  11. 记第一次实战靶场的经验
  12. 2022开源社区app源码多端圈子社区论坛系统
  13. 动态规划法和贪心算法
  14. seo优化notfallow有二种下拉菜单百度搜索引擎
  15. SQL Server中,备份数据表
  16. 如何用java的程序 计算验证条形码_java 案例之验证商品条形码
  17. workflow、BPM及EAI的区别
  18. c语言中的fock方法输出hello,(1.1.20)C程序之Fock()函数
  19. 极简使用︱Gensim-FastText 词向量训练以及OOV(out-of-word)问题有效解决
  20. 攀枝花java培训班_千里IT之行,始于中软卓越 丨中软国际成都EEC举行攀枝花学院2016年JAVA实训开班仪式...

热门文章

  1. GH3536(GH536) 热处理制度 板材和管材
  2. liblinear java_liblinear参数及使用方法(原创)
  3. vscode——html+css+js+(jQuery)动态登陆界面
  4. 计算机基础作弊,我的世界如何作弊?作弊的基本指令有哪些?
  5. 小鸡吃米java_小班语言活动小鸡吃米教案
  6. 3557: 【入门】打印小写字母表
  7. SVN 入门教程 图文教程 (对刚进公司的新人很有帮助) (帮助快速熟练使用公司的SVN版本控制工具)
  8. java之学习记录 3 - 2 - jquery
  9. 多普达创建人杨兴平:技术为王的时代已经过去
  10. 整理的一份古代诗词集+C语言固定大小文本替换