Unity3D熱更新全書-何謂熱更新,為何熱更新,如何熱更新

瘋光無線發表於2014-08-01

首先來讚歎一下中文,何謂為何如何,寫完才發現這三個詞是如此的有規律。

為何讚歎中文?因為這是一篇針對新手程式設計師的文字,是一節語文課。

然後來做一下說文解字,也就是

何謂熱更新

熱更新,每個程式設計師一聽就明白,但是它語出何處,究竟表達了什麼含義,到底代表了什麼,對技術有什麼要求,對經驗相對較少的程式設計師來說可能就有一層神祕面紗了。

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

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

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

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

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

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

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

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

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

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

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

 

讓我們暫時放過這個我們的需求連詞彙都用錯了這個基本事實,來總結一下何謂Unity3D熱更新

Unity3D熱更新就是指:使用者重啟客戶端就能實現客戶端資原始碼更新的需求或者功能。

為何熱更新

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

沒有熱更新:

pc使用者:

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

手機使用者:

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

有了熱更新

pc使用者:

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

有獨立loader的pc使用者:

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

手機使用者:

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

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

為了方便使用者、留住使用者、進而從留住的使用者身上賺到錢,熱更新如今已經成為了大部分遊戲的標配功能。

如果你的遊戲不標配這個功能,那麼競爭力就會少一些,無論是主動還是被動,無論是方便使用者還是被標配,你都必須面對熱更新這個課題,雖然這個詞用錯了。

如何熱更新

熱更新是為了讓使用者獲得資源和程式碼的變更,這裡的程式碼不是指真的程式碼,使用者不要程式碼,他要的是變化的業務邏輯。實現變更的具體過程是首先查並更新本地資源和業務邏輯,如需下載則下載。然後啟動時資源均從本地資源建立,業務邏輯從本地執行。

Unity3D提供了一種機制AssetBundle,可以滿足所有資源的比對下載載入,但是assetbundle每平臺分別打包對於多平臺專案而言比較麻煩,是一個明顯的短板,而且assetbundle不能脫離unityeditor產生,也是一個麻煩,專案大了話,多人合作,把所有資源都放入assetbundle明顯降低效率。

對於程式碼,Unity3D是不提供變更機制的。但是Unity3D執行核心是Mono,也就是dotnet,dotnet有一種符號反射機制,可以直接載入一個dll,然後反射出其中的型別進行操作。符號和反射的主要問題是有些平臺不能使用,比如ios wp8。另外dotnet有一種emit機制,可以執行時呼叫編譯器對程式碼進行編譯,他的問題也是平臺不支援。

以上兩點是Unity3D免費贈送給你的幫助

如果不能滿足你的需求,你就需要自己搞定三個模組:

資源下載模組

當assetbundle不能滿足需要時,我們需要自己建立檢查更新需要則下載的機制,也就是資源下載模組

這個資源下載模組應該有一個版本生成工具,我們將一組檔案生成一個一個版本待下載。

有一個Unity3D用的下載模組,下載模組會首先檢查伺服器上的版本資訊,和本地資訊做比對,需要的檔案則下載。

資源載入模組

然後需要建立自己的從下載儲存在本地的檔案中載入出資源的機制,也就是資源載入模組

資源載入模組負責從下載的檔案中載入出資源。

如果你希望遊戲帶有一份初始資原始檔,這裡有兩種思路

一種是資源載入模組直接提供從包內檔案和下載檔案兩種載入路徑

一種是遊戲第一次啟動時,將包內檔案全部copy到下載檔案

指令碼模組

當符號反射不能滿足需求時,業務邏輯更新就只有套用指令碼語言這一條路,也就是指令碼模組

雖然dotnet世界裡有很多指令碼可以用 ironRuby ironPython,可是在unity這個特定環境下全部不可用。

你可以使用的一個選擇是lua,這個由魔獸世界採用作為介面指令碼,從而紅遍整個遊戲行業,十年經久不衰的指令碼。

unity有了很多lua的繫結庫,也有了unilua這樣的pure c#移植實現。

你還有一個選擇是C#Light/Evil,他是C#語法的,pure c#實現的一門新生指令碼語言,就是為了Unity3D邏輯熱更新而生。

相關文章