何謂熱更新
熱更新,每個(gè)程序員一聽就明白坎缭,但是它語出何處竟痰,究竟表達(dá)了什么含義,到底代表了什么掏呼,對(duì)技術(shù)有什么要求坏快,對(duì)經(jīng)驗(yàn)相對(duì)較少的程序員來說可能就有一層神秘面紗了。
熱更新憎夷,是對(duì)hot update 或者 hot fix的翻譯莽鸿,計(jì)算機(jī)術(shù)語,表示在不停機(jī)的前提下對(duì)系統(tǒng)進(jìn)行更改岭接。
hot 就是熱富拗,機(jī)器運(yùn)行會(huì)發(fā)燙,hot就是不停機(jī)的意思鸣戴。
熱更新啃沪,是個(gè)很形象的詞,機(jī)器燙的時(shí)候更新窄锅,開著更新创千。
比如Windows 不重啟的前提下安裝補(bǔ)丁
比如Http服務(wù)器在不重啟的前提下?lián)Q掉一個(gè)文件
那么對(duì)于Unity3D來說,何謂熱更新入偷?
額……這個(gè)真相實(shí)在是不想講出來追驴,因?yàn)楹芏鄷r(shí)候,這個(gè)詞都用錯(cuò)了疏之。
Unity3D是一個(gè)客戶端工具殿雪,用戶是否重啟客戶端,根本是我們不關(guān)心的問題锋爪。
很多時(shí)候我們用著熱更新這個(gè)詞匯丙曙,卻不需要真的熱更新爸业。
只有少部分游戲,游戲資源在玩的過程中邊玩邊下亏镰,不重啟的前提下變更了資源扯旷。
我們不需要用戶不重啟客戶端就能實(shí)現(xiàn)資源代碼的更新,我們需要的是用戶重啟客戶端能實(shí)現(xiàn)資源代碼的更新索抓。
讓我們暫時(shí)放過這個(gè)我們的需求連詞匯都用錯(cuò)了這個(gè)基本事實(shí)钧忽,來總結(jié)一下何謂Unity3D熱更新
Unity3D熱更新就是指:用戶重啟客戶端就能實(shí)現(xiàn)客戶端資源代碼更新的需求或者功能。
為何熱更新
熱更新逼肯,能夠縮短用戶取得新版客戶端的流程耸黑,改善用戶體驗(yàn)。
沒有熱更新:
pc用戶:
下載客戶端->等待下載->安裝客戶端->等待安裝->啟動(dòng)->等待加載->玩
手機(jī)用戶:
商城下載APP->等待下載->等待安裝->啟動(dòng)->等待加載->玩
有了熱更新
pc用戶:
啟動(dòng)->等待熱更新->等待加載->玩
有獨(dú)立loader的pc用戶:
啟動(dòng)loader->等待熱更新->啟動(dòng)游戲->等待加載->玩
手機(jī)用戶:
啟動(dòng)->等待熱更新->等待加載->玩
通過對(duì)比就可以看出篮幢,有沒有熱更新對(duì)于用戶體驗(yàn)的影響還是挺大的崎坊,主要就是省去用戶自行更新客戶端的步驟。
為了方便用戶洲拇、留住用戶、進(jìn)而從留住的用戶身上賺到錢曲尸,熱更新如今已經(jīng)成為了大部分游戲的標(biāo)配功能赋续。
如果你的游戲不標(biāo)配這個(gè)功能敲霍,那么競爭力就會(huì)少一些罐农,無論是主動(dòng)還是被動(dòng),無論是方便用戶還是被標(biāo)配掀亥,你都必須面對(duì)熱更新這個(gè)課題昆箕,雖然這個(gè)詞用錯(cuò)了鸦列。
如何熱更新
熱更新是為了讓用戶獲得資源和代碼的變更,這里的代碼不是指真的代碼鹏倘,用戶不要代碼薯嗤,他要的是變化的業(yè)務(wù)邏輯。實(shí)現(xiàn)變更的具體過程是首先查并更新本地資源和業(yè)務(wù)邏輯纤泵,如需下載則下載骆姐。然后啟動(dòng)時(shí)資源均從本地資源創(chuàng)建,業(yè)務(wù)邏輯從本地執(zhí)行捏题。
Unity3D提供了一種機(jī)制AssetBundle玻褪,可以滿足所有資源的比對(duì)下載加載,但是assetbundle每平臺(tái)分別打包對(duì)于多平臺(tái)項(xiàng)目而言比較麻煩公荧,是一個(gè)明顯的短板带射,而且assetbundle不能脫離unityeditor產(chǎn)生,也是一個(gè)麻煩循狰,項(xiàng)目大了話窟社,多人合作券勺,把所有資源都放入assetbundle明顯降低效率。
對(duì)于代碼桥爽,Unity3D是不提供變更機(jī)制的朱灿。但是Unity3D執(zhí)行核心是Mono,也就是dotnet钠四,dotnet有一種符號(hào)反射機(jī)制盗扒,可以直接加載一個(gè)dll,然后反射出其中的類型進(jìn)行操作缀去。符號(hào)和反射的主要問題是有些平臺(tái)不能使用侣灶,比如ios wp8。另外dotnet有一種emit機(jī)制缕碎,可以運(yùn)行時(shí)調(diào)用編譯器對(duì)代碼進(jìn)行編譯褥影,他的問題也是平臺(tái)不支持。
以上兩點(diǎn)是Unity3D免費(fèi)贈(zèng)送給你的幫助
如果不能滿足你的需求咏雌,你就需要自己搞定三個(gè)模塊:
資源下載模塊
當(dāng)assetbundle不能滿足需要時(shí)凡怎,我們需要自己建立檢查更新需要?jiǎng)t下載的機(jī)制,也就是資源下載模塊赊抖。
這個(gè)資源下載模塊應(yīng)該有一個(gè)版本生成工具统倒,我們將一組文件生成一個(gè)一個(gè)版本待下載。
有一個(gè)Unity3D用的下載模塊氛雪,下載模塊會(huì)首先檢查服務(wù)器上的版本信息房匆,和本地信息做比對(duì),需要的文件則下載报亩。
資源加載模塊
然后需要建立自己的從下載保存在本地的文件中加載出資源的機(jī)制浴鸿,也就是資源加載模塊。
資源加載模塊負(fù)責(zé)從下載的文件中加載出資源弦追。
如果你希望游戲帶有一份初始資源文件岳链,這里有兩種思路
一種是資源加載模塊直接提供從包內(nèi)文件和下載文件兩種加載路徑
一種是游戲第一次啟動(dòng)時(shí),將包內(nèi)文件全部copy到下載文件
腳本模塊
當(dāng)符號(hào)反射不能滿足需求時(shí)骗卜,業(yè)務(wù)邏輯更新就只有套用腳本語言這一條路宠页,也就是腳本模塊。
雖然dotnet世界里有很多腳本可以用 ironRuby ironPython,可是在unity這個(gè)特定環(huán)境下全部不可用寇仓。
你可以使用的一個(gè)選擇是lua举户,這個(gè)由魔獸世界采用作為界面腳本,從而紅遍整個(gè)游戲行業(yè)遍烦,十年經(jīng)久不衰的腳本俭嘁。
unity有了很多l(xiāng)ua的綁定庫,也有了unilua這樣的pure c#移植實(shí)現(xiàn)服猪。
你還有一個(gè)選擇是C#Light/Evil供填,他是C#語法的拐云,pure c#實(shí)現(xiàn)的一門新生腳本語言,就是為了Unity3D邏輯熱更新而生近她。