文/哲學(xué)紳士

ET資源管理系統(tǒng)分為4個部分:打包,加載,差異化更新,web資源服務(wù)器。

本篇文章將不介紹如何搭建環(huán)境以及入門,如果不了解ET請先看ET運行指南,當(dāng)成功運行Demo后就可以繼續(xù)往下看。

首先要明白ET資源管理系統(tǒng)的使用流程,下圖可以看到后面在使用時將會涉及到的三個工具,下面會講解每個工具的作用。

150808kriq9tr16cvchr9h.png Web資源服務(wù)器源碼
全局配置:配置資源下載地址和登錄服務(wù)器地址

150809yedd191jx421dsj8.jpg 全局配置界面
保存后會將此配置序列化成txt保存到本地,具體路徑為@.\Assets\Res\Config\GlobalProto.txt,如果想要修改路徑需要修改如下圖

150810m6nz86ij6hvnrnqv.jpg 修改保存全局配置路徑指引
加載介紹:

ET在程序中是通過ResourcesComponent來同步加載,異步加載,卸載AssetBundle,下面將介紹ResourcesComponent提供的接口。

void LoadOneBundle(string assetBundleName)

assetBundleName:加載AssetBundle包的名字,例如Name.unity3d

從本地同步加載一個AssetBundle包,加載時會將包中的所有Asset對象同步加載到內(nèi)存中,如果AssetBundle包已經(jīng)加載到內(nèi)存中則不會重復(fù)加載,只會增加引用計數(shù)。

具體使用如下:

Game.Scene.GetComponent<ResourcesComponent>().LoadOneBundle(AssetBundleName.unity3d)

void LoadBundle(string assetBundleName)

assetBundleName:加載AssetBundle包的名字,例如Name.unity3d

從AssetBundleManifest中獲取此AssetBundle的所有依賴關(guān)系,然后本地同步加載所有依賴AssetBundle包,加載方式和LoadOneBundle一樣。

具體使用如下:

Game.Scene.GetComponent<ResourcesComponent>().LoadBundle(AssetBundleName.unity3d)

async Task LoadOneBundleAsync(string assetBundleName)

assetBundleName:加載AssetBundle包的名字,例如Name.unity3d

除了加載方式是異步,其他同LoadOneBundle一樣。

具體使用如下:

Game.Scene.GetComponent().LoadOneBundleAsync(AssetBundleName.unity3d)

async Task LoadBundleAsync(string assetBundleName)

assetBundleName:加載AssetBundle包的名字,例如Name.unity3d

除了加載方式是異步,其他同LoadBundle一樣。

具體使用如下:

Game.Scene.GetComponent<ResourcesComponent>().LoadBundleAsync(AssetBundleName.unity3d)

void UnloadOneBundle(string assetBundleName)

assetBundleName:卸載AssetBundle包的名字,例如Name.unity3d

卸載一個AssetBundle包,首先會減少AssetBundle包的引用計數(shù),當(dāng)引用計數(shù)為0的時候?qū)ssetBundle包移至緩存容器,緩存容器根據(jù)LRU算法進(jìn)行釋放(LRU算法詳解 ),使用AssetBundle.Unload(true)來釋放AssetBundle包的所有資源。

這里有個需要注意的地方是加載Asset到內(nèi)存中時會將對象添加到resourceCache容器中,這里進(jìn)行釋放的時候并不會移除這個引用而是保留指針,當(dāng)下次加載到同樣的Asset時會重新指向新的內(nèi)存。

具體使用如下:

Game.Scene.GetComponent<ResourcesComponent>().UnloadOneBundle(AssetBundleName.unity3d)

void UnloadBundle(string assetBundleName)

assetBundleName:卸載AssetBundle包的名字,例如Name.unity3d

從AssetBundleManifest中獲取此AssetBundle的所有依賴關(guān)系,然后卸載所有依賴AssetBundle包,卸載方式和UnloadOneBundle一樣。

具體使用如下:

Game.Scene.GetComponent<ResourcesComponent>().UnloadBundle(AssetBundleName.unity3d)

實現(xiàn)原理:

首先介紹下相關(guān)組件,如下

GlobalProto(全局配置類):

AssetBundleServerUrl:資源下載地址

Address:登錄服務(wù)器地址

string GetUrl():根據(jù)獲取當(dāng)前平臺資源下載地址(Url=AssetBundleServerUrl+平臺名/)

BundleDownloaderComponent(差異化更新組件):

int Progress:當(dāng)前差異化更新進(jìn)度。

async Task StartAsync():

首先獲取全局配置中的當(dāng)前平臺資源下載地址,然后通過UnityWebRequest異步下載資源服務(wù)器上的Version.txt,再讀取本地Version.txt,如果讀取本地Version.txt失敗則下載資源服務(wù)器上的所有資源,如果讀取本地Version.txt成功則和資源服務(wù)器上的Version.txt對比MD5,如果不一致說明需要更新,更新先通過對比Version資源列表移除本地多余的資源,然后再對比每個資源中的MD5,如果MD5不一致則添加到更新隊列,差異對比完成之后開始異步下載更新隊列資源。

async Task UpdateAsync():

首先獲取全局配置中的當(dāng)前平臺資源下載地址加上當(dāng)前下載資源名,然后通過UnityWebRequest異步下載資源服務(wù)器上的資源。

組件介紹完后開始講解運行流程,首先添加GlobalConfigComponent組件加載本地全局配置,然后BundleHelper.DownloadBundle()開始差異化更新,里面會先創(chuàng)建更新界面,界面會每秒讀取更新進(jìn)度,創(chuàng)建完界面后添加差異化更新組件,差異化更新組件初始化執(zhí)行StartAsync(),等待差異化更新完成后,從本地加載StreamingAssets AssetBundle,然后獲取此AssetBundle中的AssetBundleManifest保存到ResourcesComponent.AssetBundleManifestObject中,用于獲取資源依賴關(guān)系,到這里差異化更新結(jié)束,移除更新界面。后面就可以正常使用ResourcesComponent進(jìn)行AssetBundle加載和卸載了。

ET資源管理系統(tǒng)到這里就全部介紹完畢,有興趣的可以借鑒ET實現(xiàn)思路自己封裝一套資源管理系統(tǒng),最后感謝@熊貓 大大的開源分享,我作為ET鐵桿粉絲也是第一時間就開始抽空研究,在這里也順便推廣一下ET,希望有更多的人能夠加入ET大家庭,里面還有更多財富等著大家去挖掘,我這里分享的也只是冰山一角,今后有時間也會繼續(xù)將學(xué)到的東西再分享給大家,請大家能多多支持一下!

Via:GAD

聲明:游資網(wǎng)登載此文出于傳遞信息之目的,絕不意味著游資網(wǎng)贊同其觀點或證實其描述。

銳亞教育

銳亞教育,游戲開發(fā)論壇|游戲制作人|游戲策劃|游戲開發(fā)|獨立游戲|游戲產(chǎn)業(yè)|游戲研發(fā)|游戲運營| unity|unity3d|unity3d官網(wǎng)|unity3d 教程|金融帝國3|8k8k8k|mcafee8.5i|游戲蠻牛|蠻牛 unity|蠻牛