首先來讚歎一下中文,何謂為何如何,寫完才發現這三個詞是如此的有規律。
為何讚歎中文?因為這是一篇針對新手程式設計師的文字,是一節語文課。
然後來做一下說文解字,也就是
何謂熱更新
熱更新,每個程式設計師一聽就明白,但是它語出何處,究竟表達了什麼含義,到底代表了什麼,對技術有什麼要求,對經驗相對較少的程式設計師來說可能就有一層神祕面紗了。
熱更新,是對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邏輯熱更新而生。