什么是熱更新?
不停機(jī)更新恩商,實(shí)時(shí)更新返奉。HotUpdateHotFix
Unity中需要APP重啟
真正熱更新不重啟就做更新
為什么做熱更新贝搁?
改善用戶(hù)體驗(yàn)(節(jié)省流量、時(shí)間芽偏、操作程度)雷逆,補(bǔ)丁形式,不用玩家重復(fù)下載游戲污尉,就可以對(duì)游戲做熱修復(fù)膀哲。
如何做熱更新往产?unity3d熱更新的方法?
Android應(yīng)用的熱更新:
1.將要執(zhí)行的代碼編譯為庫(kù)文件assembly dll.動(dòng)態(tài)鏈接庫(kù)
通過(guò)反射的方式再Unity中加載被打包的dll文件并執(zhí)行:
將dll打包成AB包某宪,通過(guò)www加載在AB包捂齐,通過(guò)反射獲取到dll中的類(lèi)
WWW www = WWW.LoadFromCacheOrDownload(Application.streamingAssetsPath + "/hot.u3d",6);
yield return www;
if(www.error != null)
{
print(www.error);
yield break;
}
AssetBundle assetBundle = www.assetBundle;
TextAsset textAsset = assetBundle.LoadAsset<TextAsset>("HotFix");
Assembly assembly = Assembly.Load(textAsset.bytes);
foreach (var item in assembly.GetTypes())
{
print(item);
gameObject.AddComponent(item);
}
注意:Unity2017不支持.Net3.5以上
android與IOS熱更新有什么相同點(diǎn)和不同點(diǎn)
不同點(diǎn):
IOS不允許某些反射的高級(jí)功能,因此不能用DLL的方式做熱更新(mono打包時(shí)缩抡,會(huì)自動(dòng)將反射部分功能禁止)
相同點(diǎn):
移動(dòng)端做熱更新都是使用Unity3D+lua插件或框架
熱更新需要注意的點(diǎn):
資源奠宜、代碼包括Lua代碼都要達(dá)成assetbundle包來(lái)使用
注意幾個(gè)重要的路徑和文件夾:
Resources(會(huì)被壓縮,不管是否使用都會(huì)被打進(jìn)APK瞻想,只可讀)
StreamingAssets(不會(huì)被壓縮压真,持久化目錄,只可讀蘑险,不能坐熱更新)
Application.datapath(asset文件夾下面的路徑滴肿,也不能做熱更新)
Application.persistentDataPath(持久化數(shù)據(jù)存儲(chǔ)路徑,沙盒文件夾佃迄,在打包之前此文件夾不存在泼差。可讀可寫(xiě)呵俏,沒(méi)有任何內(nèi)容限制堆缘,從服務(wù)器上下載的AB資源,都會(huì)放到這個(gè)文件夾下進(jìn)行熱更新)
加載資源流程
開(kāi)始游戲->讀取本地版本號(hào)信息->去服務(wù)器指定地址下載服務(wù)器版本號(hào)信息->對(duì)比兩個(gè)版本號(hào)信息->如果不一致普碎,從服務(wù)器上下載全部AB資源放入(持久化目錄中去)吼肥;
加載每個(gè)資源過(guò)程 第一步嘗試從持久化目錄中加載cube,如果不存在麻车,即加載的為空缀皱,那么從StreamingAssets的文件夾中進(jìn)行加載;
unity3D那些插件用于熱更新动猬?
ULua 基于反射 性能較差 效率低 速度慢 gcalloc頻繁 停止維護(hù)只能支持到Unity3D 5.0以前
ToLua 使用的人多 維護(hù)起來(lái)快 各種靜態(tài)方法效率高 要被熱更新的文件必須使用Lua代碼寫(xiě)的
SLua 沒(méi)有知名項(xiàng)目啤斗,代碼質(zhì)量較好,可以閱讀源碼 使用靜態(tài)方法 缺點(diǎn)同ToLua
C#Light 使用較少
XLua Tencent開(kāi)發(fā)開(kāi)源熱更新插件 最大優(yōu)點(diǎn) 平時(shí)開(kāi)發(fā)使用C#赁咙,遇到有錯(cuò)誤的或者有問(wèn)題需要熱修復(fù)熱更新的時(shí)候钮莲,才對(duì)需要熱更的腳本方法進(jìn)行處理。