天天看點

Unity手遊之路<十三>手遊代碼更新政策探讨

這幾個月公司項目非常忙,加上家裡事情也多,是以blog更新一直擱置了。最近在項目開發上線過程中遇到了一些新問題,接下來的時間和大家多多探讨學習。大家在工作中遇到技術問題,或者有什麼想分享的,歡迎多多探讨 [email protected].

-------------------------------------------------------------------------------------------------------------------------------------------------------------

之前我們已經學過手機遊戲的資源熱更新政策了。在實際手遊的開發營運中,我們需要經常修複bug,增加新玩法。這些通常都涉及到代碼的更新。unity遊戲代碼的更新比較複雜,也存在不同的更新政策,各有優缺點,在不同的平台上做法也不盡相同。這裡主要談一些比較常用的政策和各大手機平台上的政策。大家有更好的思路,歡迎探讨。

(轉載請注明出處 )

反射

大部分程式設計語言都是支援反射的,利用反射,可以動态去加載所需的程式。C#也是同樣可以用反射來實作。要實作代碼的更新,我們在項目初期就要做好規劃,将一些容易變更的業務邏輯代碼獨立劃分。每次更新時,将代碼打包成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.建立CodeUpdate.cs腳本,用于加載代碼資源,反射調用。

7.為了驗證代碼更新後,可以直接加載使用,我們可以更改一下Data.cs的代碼,重複以上過程,可以看到,更新了代碼打包後,我們重新運作遊戲,就可以看到效果

Data.cs

Script.cs

CodeUpdate.cs

完整安裝包更新

大部分的app更新都是采用完整包更新。在程式啟動的時候,檢查伺服器的最新版本,如果比本地的版本要新,就下載下傳伺服器的版本,重新安裝替換本地的程式。在IOS平台上,是由App Store來統一管理的。用戶端程式隻需檢查版本,跳轉到app store頁面即可。android 平台的更新更靈活,略微複雜。在判斷版本号,确定要更新後,直接就可以下載下傳伺服器的最新的apk檔案,安裝替換本地的。這裡就不示範代碼了。大家先理清楚思路,流程,就容易實作了。

LUA腳本更新

LUA一直是一種很神奇的腳本語言,無處不在,服務端,用戶端,大型機,嵌入式裝置都能看到它的蹤影。雖然Unity3d官方不支援Lua腳本,但是已經有人寫了c#版本的lua解析器了。我們可以将業務代碼用Lua來實作。每次要更新代碼的時候,隻要将lua當做資源檔案更新到用戶端,運作即可。

C#版 Lua,有很多個版本,這裡選擇雲風他們公司開源的UniLua,大家可以去Githunb下載下傳

IOS平台

比較遺憾,IOS是一個封閉的平台,是以它對app程式監管比較嚴格,一般情況下不運作熱更新,每次版本更新都需要送出稽核。是以涉及到手遊代碼的更新,都是采用完整包更新。LUA腳本更新的方式,有朋友試過說可以(他們一般是在程式上線一段時間後才使用Lua更新)。但是也存在風險的,如果被蘋果發現,是屬于違規的。這裡不建議使用。

Android平台

目前比較通用的方式是用代碼dll反射更新機制。我們在實際過程中,将穩定不變的底層代碼單獨規劃,用作遊戲的主程式。全部業務邏輯代碼釋出時候,打包成dll,制成資源檔案。用戶端下載下傳後,反射加載。隻有當底層主程式要更新是,才單獨下載下傳主程式的apk檔案,重新安裝替換。平時的代碼更新,可以随意更新代碼dll

總結

上面說的幾種方式,各有優缺點。在不同的平台上政策也不盡相同。說一下我的經驗:一般是優先釋出android版本,有問題随時熱更新代碼調試。待版本穩定後,釋出ios越獄版本。全部穩定後,最後才釋出app store。衆所周知,app store的審查周期比較長,有可能他們員工去休個假,幾個星期才稽核通過:)。每次稽核不通過,又得重新修改送出審查,又是漫長的等待。在遊戲界,時間就是生命。我們盡量在android平台上調試版本。

ps.大家有什麼好的Unity3d技術點想讨論的,歡迎告知,我今後将會多多寫一下大家比較感興趣的實戰内容。

最後祝大家工作順利,項目大賣~。

繼續閱讀