原創
說實話我看了那麼多熱更新的文章,感覺說透的真的不多,這個東西出來都好幾年了,真的遇到問題,還是得靠這自己去看代碼研究,上一篇已經可以做出資源並且打包成遊戲了,接下來就是更新了,我建議是自己先搞搞看,搞不出來再去看別人寫的文章,會加深你的印象,那我們開始研究吧。
建議一定要在例子的基礎上去測試更新,修改弄弄看,不要一上來就自己寫,很容易出問題,一大堆問題等着你,按照框架的更新修改測試一下就成功了。例外,我發現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天,不知道哪裏出問題,就是下載不下來,後來發現就是這個選項的問題!