這幾個月公司項目非常忙,加上家里事情也多,所以blog更新一直擱置了。最近在項目開發(fā)上線過程中遇到了一些新問題,接下來的時間和大家多多探討學習。大家在工作中遇到技術問題,或者有什么想分享的,歡迎多多探討 ken@iamcoding.com.
-------------------------------------------------------------------------------------------------------------------------------------------------------------
之前我們已經學過手機游戲的資源熱更新策略了。在實際手游的開發(fā)運營中,我們需要經常修復bug,增加新玩法。這些通常都涉及到代碼的更新。unity游戲代碼的更新比較復雜,也存在不同的更新策略,各有優(yōu)缺點,在不同的平臺上做法也不盡相同。這里主要談一些比較常用的策略和各大手機平臺上的策略。大家有更好的思路,歡迎探討。
(轉載請注明出處 http://blog.csdn.net/janeky/article/details/25923151)
大部分編程語言都是支持反射的,利用反射,可以動態(tài)去加載所需的程序。C#也是同樣可以用反射來實現。要實現代碼的更新,我們在項目初期就要做好規(guī)劃,將一些容易變更的業(yè)務邏輯代碼獨立劃分。每次更新時,將代碼打包成dll,再打包成資源文件。程序啟動時,檢查更新到客戶端,客戶端通過反射重新加載代碼運行。下面通過一個簡單的demo來演示。
1.在vs中新建一個代碼庫工程,命名為test
2.添加幾個類Scirpt,Scirpt2,Data
3.將這個項目生成DLL,test.dll
4.新建一個unity項目,將DLL倒入到Asset,改名為test.bytes,不然可能會報錯
5.利用我們之前實現過的打包腳本,將test.bytes打包成test.assetbundle。
6.創(chuàng)建CodeUpdate.cs腳本,用于加載代碼資源,反射調用。
7.為了驗證代碼更新后,可以直接加載使用,我們可以更改一下Data.cs的代碼,重復以上過程,可以看到,更新了代碼打包后,我們重新運行游戲,就可以看到效果
Data.cs
Script.cs
CodeUpdate.cs
大部分的app更新都是采用完整包更新。在程序啟動的時候,檢查服務器的最新版本,如果比本地的版本要新,就下載服務器的版本,重新安裝替換本地的程序。在IOS平臺上,是由App Store來統一管理的??蛻舳顺绦蛑恍铏z查版本,跳轉到app store頁面即可。android 平臺的更新更靈活,略微復雜。在判斷版本號,確定要更新后,直接就可以下載服務器的最新的apk文件,安裝替換本地的。這里就不演示代碼了。大家先理清楚思路,流程,就容易實現了。
C#版 Lua,有很多個版本,這里選擇云風他們公司開源的UniLua,大家可以去Githunb下載
https://github.com/xebecnan/UniLua/wiki
比較遺憾,IOS是一個封閉的平臺,所以它對app程序監(jiān)管比較嚴格,一般情況下不運行熱更新,每次版本更新都需要提交審核。所以涉及到手游代碼的更新,都是采用完整包更新。LUA腳本更新的方式,有朋友試過說可以(他們一般是在程序上線一段時間后才使用Lua更新)。但是也存在風險的,如果被蘋果發(fā)現,是屬于違規(guī)的。這里不建議使用。
目前比較通用的方式是用代碼dll反射更新機制。我們在實際過程中,將穩(wěn)定不變的底層代碼單獨規(guī)劃,用作游戲的主程序。全部業(yè)務邏輯代碼發(fā)布時候,打包成dll,制成資源文件??蛻舳讼螺d后,反射加載。只有當底層主程序要更新是,才單獨下載主程序的apk文件,重新安裝替換。平時的代碼更新,可以隨意更新代碼dll
上面說的幾種方式,各有優(yōu)缺點。在不同的平臺上策略也不盡相同。說一下我的經驗:一般是優(yōu)先發(fā)布android版本,有問題隨時熱更新代碼調試。待版本穩(wěn)定后,發(fā)布ios越獄版本。全部穩(wěn)定后,最后才發(fā)布app store。眾所周知,app store的審查周期比較長,有可能他們員工去休個假,幾個星期才審核通過:)。每次審核不通過,又得重新修改提交審查,又是漫長的等待。在游戲界,時間就是生命。我們盡量在android平臺上調試版本。
ps.大家有什么好的Unity3d技術點想討論的,歡迎告知,我今后將會多多寫一下大家比較感興趣的實戰(zhàn)內容。
最后祝大家工作順利,項目大賣~。