说实话我看了那么多热更新的文章,感觉说透的真的不多,这个东西出来都好几年了,真的遇到问题,还是得靠这自己去看代码研究,上一篇已经可以做出资源并且打包成游戏了,接下来就是更新了,我建议是自己先搞搞看,搞不出来再去看别人写的文章,会加深你的印象,那我们开始研究吧。
建议一定要在例子的基础上去测试更新,修改弄弄看,不要一上来就自己写,很容易出问题,一大堆问题等着你,按照框架的更新修改测试一下就成功了。例外,我发现unity5.3打包成APK有问题,会报错,但是用5.0就没事,不知道是不是我U3D安装的有问题。
先转载一篇写更新流程的博客,很不错 http://www.xionggf.com/articles/graphic/u3d/ulua_simpleframework_res_download_flow.html
研究了一下,游戏更新是这样的,以PC端为例子,读取文件列表不同以后,会将最新的资源 拷贝一份到 C:\项目名称的文件夹 中,拷贝一份到 缓存 中,好像PC端的更新有问题,它一直读取的都是一开始的缓存,更新下来了以后只更新了C盘的文件夹,并没有更新缓存,造成一直在读取老的缓存,资源也是老的,而且它读取是缓存和本身游戏的StreamingAssets包(游戏里没有就去缓存找,都没有就报错),但是更新只更新C盘的包。有待继续研究。
读取资源的方式是www.LoadFromCacheOrDownload(先去看缓存有没有,没有再下载)这个缓存地址找了我半天,按照网上说的地址也没找到,找了半天终于找到了, 我的电脑是WIN7 64位,它的缓存地址是 C:\Users\Administrator\AppData\LocalLow\Unity\WebPlayer\Cache\DefaultCompany_SimpleFramework
如果在编辑器里并且调试模式,会直接读取工程里的文件。不是调试,会把文件拷贝一份到持久化硬盘里,因为在编辑器里,其实读取的还是工程里的。
一.使用IIS网站更新
测试我就不用服务器了(ULUA框架里自带了Server服务器也可以做更新,具体自己找教程吧),我们要做的就是手机访问工作的电脑上的网站,因为以前做过aspx.NET网站,使用的是IIS管理器,搭建就不说了,不难。唯一需要注意就是 MIME类型,添加了下面这几种格式才有下载权限,如果添加了还下载不下来就要去看网站的读写权限,网站搭建好了以后把StreamingAssets文件夹拖到网站目录下面。
添加:扩展名 .assetbundle 类型application/octet-stream (类型为字节流)
添加:扩展名 .txt 类型application/octet-stream
添加:扩展名 .manifest 类型application/octet-stream
添加:扩展名 .(空格) 类型application/octet-stream
添加:扩展名 .lua 类型application/octet-stream
二.使用官方自带的服务端更新(二选一)
以前是下载的框架里边有个Server文件夹,现在独立出来了一个项目。下载地址:https://github.com/jarjin/ServerFramework
本来不打算用的,后来发现要测试通信还是要个服务端,我蠢了,还是用服务端来做更新吧。
1.客户端修改GameManager.lua里的IP和端口 AppConst.SocketPort = 6688; AppConst.SocketAddress = "192.168.1.188";
2.服务端修改HttpService.cs的HttpService,写入更新资源服务器地址和端口,重新生成。
3.修改SuperSocket.SocketService.exe.config 配置文件里的Socket地址和端口,serverTypeName="GameManagerService" ip="192.168.1.2" port="6677"
4然后管理员身份打开Server\Server\bin\Debug\SuperSocket.SocketService.exe ,输入 r 启动服务器
5.把Server文件夹Assets同级,把要更新的资源放到Server\Assets\StreamingAssets文件夹。
三.AppConst.cs代码开启下载:
1.在U3D里,AppConst.CS里修改 WebUrl = "http://192.168.1.188/StreamingAssets/" (如果用服务端:"http://192.168.1.188:6688/";) 切记一定要有最后一个/
修改DebugMode = false 保持ExampleMode = true(这个地方还有待研究,先不要改容易出问题)
2.切换到安卓项目,打包安卓资源,工程设置:脚本定义符号Scripting Define Symbols----填入 ASYNC_MODE(非必须,看名字是异步模式,具体代码还没看)
代码里使用 ,会根据你不同定义符号编译不同的代码块,没有填写编译符号,就不会编译。 #预编译指令,在编译之前进行
#if ASYNC_MODE //if定义了ASYNC_MODE
(代码块)
#elif //其它if
#else //其它
(代码块)
#endif //结束if
三.手机访问电脑网站:
1,首先手机不能使用127.0.0.1 访问电脑本地的网站,关闭防火墙,就算开启,要开放响应端口,网站是80
2,得到电脑的局域网IP:Win+R --- 打开CMD --- ipconfig /all --- 可以查看本机局域网IP地址 比如192.168.1.88
3,(不是必须)可以固定局域网IP,修改IPv4协议
IP地址 192.168.1.188 子网掩码 255.255.255.0 默认网关192.168.1.1 首选DNS 192.168.1.1(路由器DNS) 备选DNS 114.114.114.114(国内较快)8.8.8.8(谷歌,国外较快)
四.手机真机调试
1.可以导出到AndroidStudio,去调试分析
2.查看Debug信息,装有AndroidSdk,里面有adb.exe,安卓的调试工具,直接是打不开的。手机连接电脑 ---- CMD ---- adb logcat -s Unity
如果说adb不是内部或外部命令 也不是可运行程序,要去Path里配置一下环境变量。
3.性能分析,在U3D里生成的时候选择生成选项:Autoconnect profiler,ADB调试方式,自动连接分析器,开启U3D性能分析工具的功能,前期要打开手机开发者选项---USB调试。还可以WIFI调试,Active profiler里选择手机(点击了Build And Run以后会自动打开分析器)
发现错误:Installation failed with the following output:pkg: /data/local/tmp/Package.apk (手机上已经安卓过一次该应用了,手机上删除就行)
发现错误:Error building Player: UnityException: Unable to install APK! (手机黑屏,锁屏,生成的时候要解锁)
安卓解压资源包的文件目录在Android/data/com.xxx.xxxxx/files/xxxxx 里面。
五.Lua脚本加密
AppConst类 public const bool LuaEncode = true; //使用LUA编码
工程外面的LuaEncoder文件夹应该就加密的东西,具体还没研究到这里。
研究有待继续,感觉还没有研究透更新机制,我现在有点脑子晕,有的时候感觉框架细节还有问题,不知道是我的问题,还是框架问题。
六.注意!切记!
工程设置里面的stripping level 剥离等级,就默认关闭,选择其他会下载的时候写入不到手机里,这个问题改了整整2天,不知道哪里出问题,就是下载不下来,后来发现就是这个选项的问题!