學(xué)習(xí)Unity新出資源管理系統(tǒng)-Addressable Asset

1.什么是Addressable(可尋址資產(chǎn))系統(tǒng)

可尋址資產(chǎn)系統(tǒng)提供了一種通過(guò)“地址”加載資產(chǎn)的簡(jiǎn)便方法。它通過(guò)簡(jiǎn)化內(nèi)容包的創(chuàng)建和部署來(lái)處理資產(chǎn)管理開(kāi)銷(xiāo)??蓪ぶ焚Y產(chǎn)系統(tǒng)使用異步加載來(lái)支持從任何位置加載任何依賴項(xiàng)集合。

一旦資產(chǎn)被標(biāo)記為“可尋址”,就可以從任何地方調(diào)用可尋址資產(chǎn)。無(wú)論該可尋址資產(chǎn)是駐留在本地播放器還是內(nèi)容傳送網(wǎng)絡(luò)上,系統(tǒng)都將找到并返回它。您可以通過(guò)其地址加載單個(gè)可尋址,或使用您定義的自定義組標(biāo)簽加載許多可尋址。

2.為什么要推出Addressable系統(tǒng)

  • 迭代時(shí)間:通過(guò)其地址引用內(nèi)容是超級(jí)高效的。使用地址引用,只會(huì)檢索內(nèi)容。對(duì)內(nèi)容的優(yōu)化不再需要更改代碼。

  • 依賴關(guān)系管理:系統(tǒng)不僅返回地址的內(nèi)容,還返回該內(nèi)容的所有依賴關(guān)系。系統(tǒng)會(huì)在整個(gè)資產(chǎn)準(zhǔn)備就緒時(shí)通知您,因此在返回內(nèi)容之前會(huì)加載所有網(wǎng)格,著色器,動(dòng)畫(huà)等。

  • 內(nèi)存管理:該地址不僅可以加載資產(chǎn),還可以卸載它們。引用會(huì)自動(dòng)計(jì)算,強(qiáng)大的分析器可幫助您發(fā)現(xiàn)潛在的內(nèi)存問(wèn)題。

  • 內(nèi)容打包:由于系統(tǒng)映射并理解復(fù)雜的依賴關(guān)系鏈,因此即使在移動(dòng)或重命名資產(chǎn)時(shí),它也可以有效地打包捆綁包??梢詾楸镜睾瓦h(yuǎn)程部署輕松準(zhǔn)備資產(chǎn),以支持可下載內(nèi)容(DLC)和減少應(yīng)用程序大小。

3.Addressable系統(tǒng)對(duì)比AssetBundle有什么區(qū)別

我初步學(xué)習(xí)了可尋址系統(tǒng)后,也算是對(duì)它有了一個(gè)了解。

Addressable Assets System 是由 AddressablesResourceManager組成的系統(tǒng)!
  • Addressables和ResourceManager位于不同的包中

  • Addressables 依賴于 ResourceManager

  • 在PackageManager中引入Addressables時(shí),ResourceManager會(huì)自動(dòng)包含

  • 全部用C#編寫(xiě)

ResourceManager是一個(gè)用于正確管理資源加載和卸載的框架
  • 使用引用計(jì)數(shù)執(zhí)行卸載管理

  • DI可以定制加載過(guò)程等

  • 它具有方便的功能,例如顯示資源加載情況的分析器

可尋址資源系統(tǒng)與AssetBundle的區(qū)別

1.可尋址資源系統(tǒng)只需要一個(gè)資源的地址就可以從任意地方進(jìn)行加載,而AssetBundle需要從制定bundle中加載資源。

2.可尋址資源系統(tǒng)加載到內(nèi)存中的bundle有引用計(jì)數(shù),而AssetBundle加載到內(nèi)存中的bundle需要自己進(jìn)行管理。

3.可尋址資源系統(tǒng)會(huì)自己管理依賴關(guān)系,而AssetBundle需要自己管理依賴關(guān)系,維護(hù)起來(lái)比較困難。

4.可尋址資源系統(tǒng)默認(rèn)的所有加載操作都是異步操作,可以添加事件監(jiān)聽(tīng),而AssetBundle則有同步和異步加載。

4.Addressable系統(tǒng)怎么使用

1.Addressable Assets 窗口

第一次打開(kāi)" Window -> Asset Management -> Addressable Assets "會(huì)需要新建一個(gè)Addressable 設(shè)置,默認(rèn)資源分為兩組Build In Data,Default Local Group。前者不能改動(dòng),而后者我們可以在組里進(jìn)行添加和刪除。我們也可以通過(guò)在Addressable Assets窗口右鍵再選中Create New Group-> Packed Assets來(lái)新建組。

1564144976455.png

2.標(biāo)記資源

通過(guò)勾選預(yù)設(shè)/聲音等資源為可尋址資源。

1564145221216.png

然后在Addressable Assets面板上就會(huì)有它選中后的狀態(tài)。


1564145286124.png
1564147005233.png

目前好像還沒(méi)有把一個(gè)可尋址資源文件夾下面的所有資源都自動(dòng)標(biāo)記為可尋址資源,還是需要手動(dòng),如果有大佬知道的話可以拿出來(lái)看下!

3.加載資源

在我們添加好可尋址資源后,就可以在代碼中通過(guò)可尋址資源的地址來(lái)加載資源了。可尋址資源有3個(gè)模式可選擇

1564147732419.png

Fast Mode: 快速模式:直接加載文件而不打包,快速但Profiler獲取的信息較少;在此模式下,我們使用 AssetDatabase.LoadAssetAtPath 直接加載文件。雖然AssetBundle構(gòu)建可以不要求立即執(zhí)行的,它不能在探查證實(shí),如果他們被列入其中AssetBundle資產(chǎn)。 Virtual Mode:虛擬模式:在不打包的情況下模擬靠近AssetBundle的操作;與FastMode不同,您可以查看哪個(gè)AssetBundle包含資產(chǎn)。此模式最終還加載了AssetDatabase.LoadAssetAtPath 。雖然AssetBundle構(gòu)建是沒(méi)有必要的,第一為了構(gòu)建AssetBundle和資產(chǎn)之間的對(duì)應(yīng)關(guān)系。還可以通過(guò)設(shè)置虛擬通信速度來(lái)模擬加載時(shí)間。Packed Mode:打包模式:實(shí)際上是從AssetBundle打包和加載;在這種模式下,實(shí)際構(gòu)建并加載AssetBundle。

通過(guò)key加載

void Start()
{
hand = Addressables.LoadAssetAsync<GameObject>("Cube");
hand.Completed += OnResLoadedHandler;
}
?
private void OnResLoadedHandler(AsyncOperationHandle<GameObject> obj)
{
GameObject go = obj.Result;
Instantiate(go);
}</pre>

我們可以直接通過(guò) Addressables類(lèi)的LoadAssetAsync接口來(lái)加載資源,參數(shù)為可尋址資源的地址。通過(guò)監(jiān)聽(tīng)事件,在加載完成后完成實(shí)例化。

Addressables.InstantiateAsync("Cube");

我們也可以直接通過(guò)Addressables類(lèi)的InstantiateAsync接口來(lái)直接實(shí)例化資源。

通過(guò)AssetReference加載

AssetReference類(lèi)提供了一個(gè)機(jī)制來(lái)訪問(wèn)的資產(chǎn),而不需要知道的字符串(或其他方式)的地址。

要使用*AssetReference 類(lèi)訪問(wèn)可尋址資產(chǎn):

我們?cè)诶^承自monobehaviour的腳步中添加一個(gè)成員:

public AssetReference ar;

然后在該腳本組件的視圖中就可以選擇可尋址資產(chǎn)了。

1564148138753.png

這樣我們就無(wú)需知道該可尋址資源的地址也可以直接加載它。

我們也可以通過(guò)繼承AssetReference直接通過(guò)組件來(lái)加載資源。詳細(xì)方法可參考官方案例:

https://github.com/Unity-Technologies/Addressables-Sample/tree/master/Basic/ComponentReference

4.可尋址資產(chǎn)系統(tǒng)的加載

游戲?qū)ο髮?shí)例化要加載,使用Addressables.InstantiateAsync。這將實(shí)例化傳入指定的預(yù)制件location。Addressables將加載Prefab及其依賴項(xiàng),在該加載期間遞增所有項(xiàng)的引用計(jì)數(shù)。InstantiateAsync在同一地址上調(diào)用三次將導(dǎo)致所有依賴資產(chǎn)的ref-count為3。LoadAssetAsync調(diào)用三次則不同,每次InstantiateAsync呼叫都會(huì)AsyncOperationHandle指向一個(gè)獨(dú)特的操作。這是因?yàn)槊總€(gè)結(jié)果InstantiateAsync都是一個(gè)唯一的實(shí)例。InstantiateAsync和其他加載調(diào)用之間的另一個(gè)區(qū)別是可選參數(shù)trackHandle。如果將其設(shè)置為false,則必須保留AsyncOperationHandle在發(fā)布實(shí)例期間使用它。這樣更有效,但需要游戲開(kāi)發(fā)人員付出更多努力。

游戲?qū)ο髮?shí)例化要卸載,使用Addressables.ReleaseInstance或關(guān)閉實(shí)例化對(duì)象所在的場(chǎng)景。此場(chǎng)景可能已加載(因此已關(guān)閉)AdditiveSingle模式。此場(chǎng)景也可以通過(guò)Addressables或SceneManagement加載。如上所述,如果設(shè)置trackHandle為false,則只能Addressables.ReleaseInstance使用句柄調(diào)用,而不能使用實(shí)際的GameObject 調(diào)用。

關(guān)于以下內(nèi)容的注釋Addressables.ReleaseInstance:如果您調(diào)用Addressables.ReleaseInstance的是未通過(guò)可尋址創(chuàng)建的實(shí)例,或者使用trackHandle = false創(chuàng)建的實(shí)例,我們會(huì)檢測(cè)Addressables.ReleaseInstance到該實(shí)例并返回false以指示它無(wú)法釋放傳遞給它的實(shí)例。

Addressables.InstantiateAsync有一些與之相關(guān)的開(kāi)銷(xiāo),所以如果你需要每幀100次實(shí)例化相同的對(duì)象,你應(yīng)該考慮通過(guò)Addressables加載,然后實(shí)例化外部的Addressables。在這種情況下,您可以調(diào)用Addressables.LoadAssetAsync,然后保存結(jié)果,并調(diào)用GameObject.Instantiate()該結(jié)果。這使您可以靈活地以同步方式調(diào)用Instantiate。缺點(diǎn)是我們不知道你創(chuàng)建了多少個(gè)實(shí)例。如果你打電話時(shí)還有漂浮的實(shí)例Addressables.Release,你可能會(huì)陷入糟糕的境地。例如,引用紋理的預(yù)制件將不再具有要引用的有效(加載)紋理,從而導(dǎo)致渲染問(wèn)題(或更糟)。由于我們可能無(wú)法立即觸發(fā)內(nèi)存卸載(請(qǐng)參閱下面的“清除內(nèi)存時(shí)”),因此很難跟蹤這些類(lèi)型的問(wèn)題。

5.可尋址資產(chǎn)系統(tǒng)的Profiler

Window -> Asset Management -> Resource Profiler 打開(kāi)。

此窗口的目的是向您顯示所有Addressables System操作的引用計(jì)數(shù)的狀態(tài)。這些操作包括資產(chǎn)包加載,資產(chǎn)加載等。

  • 白色垂直線表示發(fā)生加載請(qǐng)求的幀。

  • 藍(lán)色背景表示當(dāng)前加載了有問(wèn)題的資產(chǎn)。

  • 圖表的綠色部分表示當(dāng)前的重新計(jì)數(shù)。

以上就是我對(duì)可尋址資產(chǎn)系統(tǒng)的初步了解了。

我對(duì)addressable和ab做了更詳細(xì)的對(duì)比,有興趣的可以打開(kāi)下面的文章

Addressable Asset System(進(jìn)階版AB)和AssetBundle(以下簡(jiǎn)稱AB)制作的資源管理系統(tǒng)的對(duì)比 http://www.itdecent.cn/p/8009c16fcab3

參考了以下文章:https://blog.csdn.net/u010019717/article/details/81146982

https://docs.unity3d.com/Packages/com.unity.addressables@1.1/manual/index.html

Unity官方可尋址資產(chǎn)系統(tǒng)案例:https://github.com/Unity-Technologies/Addressables-Sample

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容