1. 程式人生 > >Unity3D 熱更新方案(集合各位專家的彙總)

Unity3D 熱更新方案(集合各位專家的彙總)

一、什麼是熱更新?

熱更新,是對hot update或者hot fix的翻譯,計算機術語,表示在不停機的前提下對系統進行更改(摘抄一下):

hot就是熱,機器執行會發燙,hot就是不停機的意思。

熱更新,是個很形象的詞,機器燙的時候更新,開著更新。

比如Windows不重啟的前提下安裝補丁

比如Http伺服器在不重啟的前提下換掉一個檔案

那麼對於Unity3D來說,何謂熱更新?

……這個真相實在是不想講出來,因為很多時候,這個詞都用錯了。

Unity3D是一個客戶端工具,使用者是否重啟客戶端,根本是我們不關心的問題。

很多時候我們用著熱更新這個詞彙,卻不需要真的熱更新。

只有少部分遊戲,遊戲資源在玩的過程中邊玩邊下,不重啟的前提下變更了資源。

我們不需要使用者不重啟客戶端就能實現資原始碼的更新,我們需要的是使用者重啟客戶端能實現資原始碼的更新。

讓我們暫時放過這個我們的需求連詞彙都用錯了這個基本事實,來總結一下何謂Unity3D熱更新Unity3D熱更新就是指:使用者重啟客戶端就能實現客戶端資原始碼更新的需求或者功能。

二、為什麼要熱更新?

熱更新,能夠縮短使用者取得新版客戶端的流程,改善使用者體驗

沒有熱更新:

pc使用者:

下載客戶端->等待下載->安裝客戶端->等待安裝->啟動->等待載入->

手機使用者:

商城下載APP->等待下載->等待安裝->啟動->

等待載入->

有了熱更新:

pc使用者:

啟動->等待熱更新->等待載入->

有獨立loaderpc使用者:

啟動loader->等待熱更新->啟動遊戲->等待載入->

手機使用者:

啟動->等待熱更新->等待載入->

通過對比就可以看出,有沒有熱更新對於使用者體驗的影響還是挺大的,主要就是省去使用者自行更新客戶端的步驟。

三、如何熱更新?Unity3D的熱更新的方法比較

3.1Android應用的熱更新

• 將執行程式碼預編譯為assemblydll

• 將程式碼作為TextAsset打包進Assetbundle

• 執行時,使用Reflection機制實現程式碼的功能。

• 更新相應的Assetbundle即可實現熱更新。

3.2Android iOS 熱更新的異同

• 蘋果官方禁止iOS下的程式熱更新;JITiOS下無效。

• 熱更新方案:Unity+Lua外掛。

3.3使用Lua 外掛進行iOS 熱更新的原理

3.4Unity 熱更新的注意點

• 需要更新的程式碼、資源,都必須打包成AssetBundle(建議使用未壓縮的格式打包)

• 熟悉Unity的幾個重要的路徑

• Resources(只讀)

• StreamingAssets(只讀)

• Application.dataPath(只讀)

• Application.persistentDataPath(可讀寫)

3.5、重要路徑之Resources

• Resources資料夾下的資源無論使用與否都會被打包

• 資源會被壓縮,轉化成二進位制

• 打包後文件夾下的資源只讀

• 無法動態更改,無法做熱更新

• 使用Resources.Load載入

3.6、重要路徑之StreamingAssets

• 流資料的快取目錄

• 資料夾下的資源無論使用與否都會被打包

• 資源不會被壓縮和加密

• 打包後文件夾下的資源只讀,主要存放二進位制檔案

• 無法做熱更新

• WWW類載入(一般用CreateFromFile ,若資源是AssetBundle,依據其打包方式看是否是壓縮的來決定)

• 相對路徑,具體路徑依賴於實際平臺

•Application.streamingAssetsPath

• IOS: Application.dataPath + “/Raw” Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/xxx.app/Data/Raw

3.7、重要路徑之Application.dataPath

• 遊戲的資料資料夾的路徑(例如在Editor中的Assets

• 很少用到

• 無法做熱更新

• IOS路徑: Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/xxx.app/Data

3.8、重要路徑之Application.persistentDataPath

• 持久化資料儲存目錄的路徑(沙盒目錄,打包之前不存在

• 資料夾下的資源無論使用與否都會被打包

• 執行時有效,可讀寫

• 無內容限制,從StreamingAsset中讀取二進位制檔案或從AssetBundle讀取檔案來寫入PersistentDataPath

• 適合熱更新

• IOS路徑: Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/Documents

3.9、使用Lua 外掛進行iOS 熱更新的總體流程


四、支援Unity iOS 熱更新的各種Lua 外掛的對比

4.1uLua(asset store)

• uLua外掛原生版本,開山鼻祖

• 不會產生靜態程式碼

• 反射機制,效率低下,速度慢,gcalloc頻繁

• 已停止更新維護,不支援Unity5.x,淡出主流

4.2uLua & cstoLua

• 開發平臺成熟穩定,Bug修復迅速

• 開發者眾多,資源豐富

• 靜態方法,效能優

 有成功商業產品案例(啪啪三國、超神戰隊、酷魚吧捕魚、絕地戰警、這不是刀塔等)

• 都是基於原生版本的改進;未來,兩者會合併成一個外掛

開源專案地址:

4.3sLua

• 靜態方法,效能優

• 核心程式碼簡潔

• 資源較少,開發平臺不夠成熟穩定

• 無成功商業產品案例成功商業產品案例

• 基於原生版本的改進

開源專案地址:

4.4C#Light(L#)

• 淡出主流,想要了解的小夥伴點選這裡:

4.5 uniLua

• c#實現的Lua虛擬機器,非完整方案

• 淡出主流

4.6、各位專家給出的分析

下圖縱座標為測試用例,橫座標是消耗時間或記憶體分配對數座標 )。

綜合來看肯定是uLua & cstoLua會更好一些。

五、實踐

熟悉NGUI的小夥伴可以參考這裡:

熟悉UGUI的小夥伴可以參考這裡: