說(shuō)實(shí)話我看了那么多熱更新的文章,感覺(jué)說(shuō)透的真的不多,這個(gè)東西出來(lái)都好幾年了,真的遇到問(wèn)題,還是得靠這自己去看代碼研究,上一篇已經(jīng)可以做出資源并且打包成游戲了,接下來(lái)就是更新了,我建議是自己先搞搞看,搞不出來(lái)再去看別人寫(xiě)的文章,會(huì)加深你的印象,那我們開(kāi)始研究吧。
建議一定要在例子的基礎(chǔ)上去測(cè)試更新,修改弄弄看,不要一上來(lái)就自己寫(xiě),很容易出問(wèn)題,一大堆問(wèn)題等著你,按照框架的更新修改測(cè)試一下就成功了。例外,我發(fā)現(xiàn)unity5.3打包成APK有問(wèn)題,會(huì)報(bào)錯(cuò),但是用5.0就沒(méi)事,不知道是不是我U3D安裝的有問(wèn)題。
先轉(zhuǎn)載一篇寫(xiě)更新流程的博客,很不錯(cuò) http://www.xionggf.com/articles/graphic/u3d/ulua_simpleframework_res_download_flow.html
研究了一下,游戲更新是這樣的,以PC端為例子,讀取文件列表不同以后,會(huì)將最新的資源 拷貝一份到 C:\項(xiàng)目名稱的文件夾 中,拷貝一份到 緩存 中,好像PC端的更新有問(wèn)題,它一直讀取的都是一開(kāi)始的緩存,更新下來(lái)了以后只更新了C盤的文件夾,并沒(méi)有更新緩存,造成一直在讀取老的緩存,資源也是老的,而且它讀取是緩存和本身游戲的StreamingAssets包(游戲里沒(méi)有就去緩存找,都沒(méi)有就報(bào)錯(cuò)),但是更新只更新C盤的包。有待繼續(xù)研究。
讀取資源的方式是www.LoadFromCacheOrDownload(先去看緩存有沒(méi)有,沒(méi)有再下載)這個(gè)緩存地址找了我半天,按照網(wǎng)上說(shuō)的地址也沒(méi)找到,找了半天終于找到了, 我的電腦是WIN7 64位,它的緩存地址是 C:\Users\Administrator\AppData\LocalLow\Unity\WebPlayer\Cache\DefaultCompany_SimpleFramework
如果在編輯器里并且調(diào)試模式,會(huì)直接讀取工程里的文件。不是調(diào)試,會(huì)把文件拷貝一份到持久化硬盤里,因?yàn)樵诰庉嬈骼铮鋵?shí)讀取的還是工程里的。
一.使用IIS網(wǎng)站更新
測(cè)試我就不用服務(wù)器了(ULUA框架里自帶了Server服務(wù)器也可以做更新,具體自己找教程吧),我們要做的就是手機(jī)訪問(wèn)工作的電腦上的網(wǎng)站,因?yàn)橐郧白鲞^(guò)aspx.NET網(wǎng)站,使用的是IIS管理器,搭建就不說(shuō)了,不難。唯一需要注意就是 MIME類型,添加了下面這幾種格式才有下載權(quán)限,如果添加了還下載不下來(lái)就要去看網(wǎng)站的讀寫(xiě)權(quán)限,網(wǎng)站搭建好了以后把StreamingAssets文件夾拖到網(wǎng)站目錄下面。
添加:擴(kuò)展名 .assetbundle 類型application/octet-stream (類型為字節(jié)流)
添加:擴(kuò)展名 .txt 類型application/octet-stream
添加:擴(kuò)展名 .manifest 類型application/octet-stream
添加:擴(kuò)展名 .(空格) 類型application/octet-stream
添加:擴(kuò)展名 .lua 類型application/octet-stream
二.使用官方自帶的服務(wù)端更新(二選一)
以前是下載的框架里邊有個(gè)Server文件夾,現(xiàn)在獨(dú)立出來(lái)了一個(gè)項(xiàng)目。下載地址:https://github.com/jarjin/ServerFramework
本來(lái)不打算用的,后來(lái)發(fā)現(xiàn)要測(cè)試通信還是要個(gè)服務(wù)端,我蠢了,還是用服務(wù)端來(lái)做更新吧。
1.客戶端修改GameManager.lua里的IP和端口 AppConst.SocketPort = 6688; AppConst.SocketAddress = "192.168.1.188";
2.服務(wù)端修改HttpService.cs的HttpService,寫(xiě)入更新資源服務(wù)器地址和端口,重新生成。
3.修改SuperSocket.SocketService.exe.config 配置文件里的Socket地址和端口,serverTypeName="GameManagerService" ip="192.168.1.2" port="6677"
4然后管理員身份打開(kāi)Server\Server\bin\Debug\SuperSocket.SocketService.exe ,輸入 r 啟動(dòng)服務(wù)器
5.把Server文件夾Assets同級(jí),把要更新的資源放到Server\Assets\StreamingAssets文件夾。
三.AppConst.cs代碼開(kāi)啟下載:
1.在U3D里,AppConst.CS里修改 WebUrl = "http://192.168.1.188/StreamingAssets/" (如果用服務(wù)端:"http://192.168.1.188:6688/";) 切記一定要有最后一個(gè)/
修改DebugMode = false 保持ExampleMode = true(這個(gè)地方還有待研究,先不要改容易出問(wèn)題)
2.切換到安卓項(xiàng)目,打包安卓資源,工程設(shè)置:腳本定義符號(hào)Scripting Define Symbols----填入 ASYNC_MODE(非必須,看名字是異步模式,具體代碼還沒(méi)看)
代碼里使用 ,會(huì)根據(jù)你不同定義符號(hào)編譯不同的代碼塊,沒(méi)有填寫(xiě)編譯符號(hào),就不會(huì)編譯。 #預(yù)編譯指令,在編譯之前進(jìn)行
#if ASYNC_MODE //if定義了ASYNC_MODE
(代碼塊)
#elif //其它if
#else //其它
(代碼塊)
#endif //結(jié)束if
三.手機(jī)訪問(wèn)電腦網(wǎng)站:
1,首先手機(jī)不能使用127.0.0.1 訪問(wèn)電腦本地的網(wǎng)站,關(guān)閉防火墻,就算開(kāi)啟,要開(kāi)放響應(yīng)端口,網(wǎng)站是80
2,得到電腦的局域網(wǎng)IP:Win+R --- 打開(kāi)CMD --- ipconfig /all --- 可以查看本機(jī)局域網(wǎng)IP地址 比如192.168.1.88
3,(不是必須)可以固定局域網(wǎng)IP,修改IPv4協(xié)議
IP地址 192.168.1.188 子網(wǎng)掩碼 255.255.255.0 默認(rèn)網(wǎng)關(guān)192.168.1.1 首選DNS 192.168.1.1(路由器DNS) 備選DNS 114.114.114.114(國(guó)內(nèi)較快)8.8.8.8(谷歌,國(guó)外較快)
四.手機(jī)真機(jī)調(diào)試
1.可以導(dǎo)出到AndroidStudio,去調(diào)試分析
2.查看Debug信息,裝有AndroidSdk,里面有adb.exe,安卓的調(diào)試工具,直接是打不開(kāi)的。手機(jī)連接電腦 ---- CMD ---- adb logcat -s Unity
如果說(shuō)adb不是內(nèi)部或外部命令 也不是可運(yùn)行程序,要去Path里配置一下環(huán)境變量。
3.性能分析,在U3D里生成的時(shí)候選擇生成選項(xiàng):Autoconnect profiler,ADB調(diào)試方式,自動(dòng)連接分析器,開(kāi)啟U3D性能分析工具的功能,前期要打開(kāi)手機(jī)開(kāi)發(fā)者選項(xiàng)---USB調(diào)試。還可以WIFI調(diào)試,Active profiler里選擇手機(jī)(點(diǎn)擊了Build And Run以后會(huì)自動(dòng)打開(kāi)分析器)
發(fā)現(xiàn)錯(cuò)誤:Installation failed with the following output:pkg: /data/local/tmp/Package.apk (手機(jī)上已經(jīng)安卓過(guò)一次該應(yīng)用了,手機(jī)上刪除就行)
發(fā)現(xiàn)錯(cuò)誤:Error building Player: UnityException: Unable to install APK! (手機(jī)黑屏,鎖屏,生成的時(shí)候要解鎖)
安卓解壓資源包的文件目錄在Android/data/com.xxx.xxxxx/files/xxxxx 里面。
五.Lua腳本加密
AppConst類 public const bool LuaEncode = true; //使用LUA編碼
工程外面的LuaEncoder文件夾應(yīng)該就加密的東西,具體還沒(méi)研究到這里。
研究有待繼續(xù),感覺(jué)還沒(méi)有研究透更新機(jī)制,我現(xiàn)在有點(diǎn)腦子暈,有的時(shí)候感覺(jué)框架細(xì)節(jié)還有問(wèn)題,不知道是我的問(wèn)題,還是框架問(wèn)題。
六.注意!切記!
工程設(shè)置里面的stripping level 剝離等級(jí),就默認(rèn)關(guān)閉,選擇其他會(huì)下載的時(shí)候?qū)懭氩坏绞謾C(jī)里,這個(gè)問(wèn)題改了整整2天,不知道哪里出問(wèn)題,就是下載不下來(lái),后來(lái)發(fā)現(xiàn)就是這個(gè)選項(xiàng)的問(wèn)題!
聯(lián)系客服