@作者 : SYFStrive
@博客首頁 : HomePage
??:個人社區(qū)(歡迎大佬們加入) ??:社區(qū)鏈接??
???♀?:創(chuàng)作不易轉(zhuǎn)發(fā)需經(jīng)作者同意??
??:程序員每天堅持鍛煉???? U3D熱更新技術(shù)(??)
理論知識
??冷更新及熱更新?
?????1、什么是冷更新
??:開發(fā)者將測試好的代碼,發(fā)布到應(yīng)用商店的審核平臺,平臺方會進行穩(wěn)定性及性能測試。?? 測試成功后,用戶即可在 ?? 如蘋果的AppStore看到應(yīng)用的更新信息,用戶點擊應(yīng)用更新后,需要先關(guān)閉應(yīng)用,再進行更新。 ?? 人話:重裝
?????2、什么是熱更新
??:什么是熱更新?
???♂?廣義:無需關(guān)閉應(yīng)用,不停機狀態(tài)下修復(fù)漏洞,指軟件不通過運營商店的軟件版本更新審核,直接通過應(yīng)用自行下載的軟件數(shù)據(jù)更新資源的行為,重點是更新邏輯代碼。
???♂?狹義:( iOS熱更新為例)?? 無需將代碼重新打包提交至AppStore,即可更新客戶端的執(zhí)行代碼,即不用下載App而自動更新程序。
???♂?現(xiàn)狀:蘋果禁止了C#的部分反射操作,禁止JIT(即時編譯,程序運行時創(chuàng)建并運行新代碼),不允許邏輯熱更新,只允許使用AssetBundle進行資源熱更新。
? 注意:2017年6月1日,蘋果更新了熱更新政策說明,上線后的項目,一旦發(fā)現(xiàn)使用熱更新,一樣會以下架處理
?????3、為何要熱更新
??縮短用戶獲取新版應(yīng)用的客戶端的流程,改善用戶體驗具體到iOS平臺的應(yīng)用上,有以下幾個原因
- AppStore的審核周期難控制 ?? 需要5-7天時間甚至更久
- 手機應(yīng)用更新頻繁
- 對于大型應(yīng)用,更新成本太大
- 終極目標 ?? 不重新下載、不停機狀態(tài)下完全變換一個應(yīng)用的內(nèi)容
?????4、不同平臺的熱更新技術(shù)
?? Android,PC(C#)
- 將執(zhí)行代碼預(yù)編譯為AssemblyDLL
- 將代碼作為TextAsset打包進AssetBundle
- 運行時調(diào)用AssemblyDLL代碼
- 更新相應(yīng)的AssetBundle即可實現(xiàn)熱更新
?? iOS(Lua)
蘋果官方禁止iOS下的程序熱更新;JIT在iOS下無效熱更新方案:Unity + Lua插件
?????5、常見的Unity熱更新插件
- sLua:最快的Lua插件
- toLua:由uLua發(fā)展而來的,第三代Lua熱更新方案
- xLua:特性最先進的Lua插件
- ILRuntime:純C#實現(xiàn)的熱更新插件
?????6、Lua的加載器規(guī)則
流程如??
- xLua的單例運行環(huán)境
- xLua解析器創(chuàng)建銷毀
- xLua加載器編寫
- xLua中Lua調(diào)用C#代碼
- xLua中C#調(diào)用Lua代碼
??熱更新Lua語法?
基礎(chǔ)思維導(dǎo)入如:
?????0、環(huán)境安裝
環(huán)境搭載 ?? https://github.com/rjpcomputing/luaforwindows/
安裝 ?? 無腦下一步即可
Windows+R ?? Lua 如??(安裝成功)
?????1、Lua面向?qū)ο?/h2>
繼承、封裝、多態(tài)演示如 ??
--萬物之父
Object={}
print("====封裝====")
function Object:new()
local obj={}
self.__index=self
setmetatable(obj,self)
return obj
end
print("====繼承====")
function Object:SubClass( className )
_G[className]={}
local obj = _G[className]
obj.base=self
self.__index=self
setmetatable(obj,self)
end
--新的類
Object:SubClass("Person")
Person.age=18
Person.sex="男"
function Person:Like()
self.age=self.age+1
self.sex="男女不分"
end
local obj = Person:new()
print(obj.age)
print(obj:Like())
print(obj.age)
print(obj.sex)
print("====多態(tài)====")
Person:SubClass("Player")
local obj = Player:new()
print(obj.age)
function Player:Like()
self.base.Like(self)
self.age=self.age+100
self.sex="女"
end
local X = Player:new()
print(X:Like())
print(X.age)
print(X.sex)
??熱更新AssetBundel?
AssetBundel簡稱AB包孢子????
基礎(chǔ)思維導(dǎo)入如:
?????0、AB是什么
- 特定于平臺的資產(chǎn)壓縮包,有點類似壓縮文件
- 資產(chǎn)包括:模型、貼圖、預(yù)設(shè)體、音效、材質(zhì)球等等
?????1、AB包思維導(dǎo)圖
?????2、了解AB包有什么作用
- 相對Resources下的資源AB包更好管理資源
- 減小包體大小Resources和AB包區(qū)別
1、Resources(打包時定死只讀無法修改)
2、AB包 ?? 存儲位置可自定義壓縮方式自定義后期可以動態(tài)更新
3、減少初始包大小 如:下載游戲后再慢慢更新 - 熱更新
1、資源熱更新
2、腳本熱更新
3、熱更新基本規(guī)則
????客戶端、自帶很少默認資源、資源對比文件
????第一步→ 向服務(wù)器獲取資源服務(wù)器地址
????第二步→ 通過資源對比文件,檢查哪些要下載,下載AB包
????服務(wù)器 ?? 資源服務(wù)器、資源對比文件、最新的各種AB包
?????3、生成AB包資源文件
?????4、UnityAB包
代碼如??
using System.Collections;
using UnityEngine;
public class AB : MonoBehaviour
{
private void Start()
{
//同步加載===============
//第一步 加載AB包
AssetBundle ab = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/" + "cube");
//第二部 加載AB包中的資源
//GameObject obj = ab.LoadAsset<GameObject>("cube");
GameObject obj1 = ab.LoadAsset("cube", typeof(GameObject)) as GameObject;
Instantiate(obj1);
//異步加載===============
StartCoroutine(AsyLoadAB("aa", "Capsule"));
//卸載場景中的AB包===============
AssetBundle.UnloadAllAssetBundles(false);
ab.Unload(false);
//當對象使用了不同包里面的資源的時候據(jù)需要加載對應(yīng)的依賴包 才能正常===============
//AssetBundle ab1 = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/" + "......");
利用依賴包的關(guān)鍵知識點--利用主包 獲取依賴信息===============
//AssetBundle ab1 = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/" + "StandaloneWindows");
加載主包中的固定信息
//AssetBundleManifest abMani = ab1.LoadAsset<AssetBundleManifest>("AssetBundleManifest");
從主包文件中 得到依賴信息
//string[] strs=abMani.GetAllDependencies("......");
得到依賴包的名字
//print("Name");
//AssetBundle ab2 = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/" + strs[1]);
}
IEnumerator AsyLoadAB(string ABNamae, string ABNamae1)
{
//第一步 加載AB包
AssetBundleCreateRequest ab =AssetBundle.LoadFromFileAsync(Application.streamingAssetsPath + "/" + ABNamae);
yield return ab;
//第二部 加載AB包中的資源
AssetBundleRequest AB= ab.assetBundle.LoadAssetAsync(ABNamae1, typeof(GameObject));
yield return AB;
Instantiate(AB.asset as GameObject);
}
}
最后
?
本文到這里就結(jié)束了,大佬們的支持是我持續(xù)更新的最大動力,希望這篇文章能幫到大家???????????????????相關(guān)專欄連接??
下篇文章再見ヾ( ̄▽ ̄)ByeBye文章來源:http://www.zghlxwxcb.cn/news/detail-787977.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-787977.html
到了這里,關(guān)于U3D熱更新技術(shù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!