1.什么是Addressable(可尋址資產(chǎn))系統(tǒng)
可尋址資產(chǎn)系統(tǒng)提供了一種通過“地址”加載資產(chǎn)的簡便方法。它通過簡化內(nèi)容包的創(chuàng)建和部署來處理資產(chǎn)管理開銷。可尋址資產(chǎn)系統(tǒng)使用異步加載來支持從任何位置加載任何依賴項集合。
一旦資產(chǎn)被標記為“可尋址”,就可以從任何地方調(diào)用可尋址資產(chǎn)。無論該可尋址資產(chǎn)是駐留在本地播放器還是內(nèi)容傳送網(wǎng)絡(luò)上,系統(tǒng)都將找到并返回它。您可以通過其地址加載單個可尋址,或使用您定義的自定義組標簽加載許多可尋址。
2.為什么要推出Addressable系統(tǒng)
迭代時間:通過其地址引用內(nèi)容是超級高效的。使用地址引用,只會檢索內(nèi)容。對內(nèi)容的優(yōu)化不再需要更改代碼。
依賴關(guān)系管理:系統(tǒng)不僅返回地址的內(nèi)容,還返回該內(nèi)容的所有依賴關(guān)系。系統(tǒng)會在整個資產(chǎn)準備就緒時通知您,因此在返回內(nèi)容之前會加載所有網(wǎng)格,著色器,動畫等。
內(nèi)存管理:該地址不僅可以加載資產(chǎn),還可以卸載它們。引用會自動計算,強大的分析器可幫助您發(fā)現(xiàn)潛在的內(nèi)存問題。
內(nèi)容打包:由于系統(tǒng)映射并理解復(fù)雜的依賴關(guān)系鏈,因此即使在移動或重命名資產(chǎn)時,它也可以有效地打包捆綁包??梢詾楸镜睾瓦h程部署輕松準備資產(chǎn),以支持可下載內(nèi)容(DLC)和減少應(yīng)用程序大小。
3.Addressable系統(tǒng)對比AssetBundle有什么區(qū)別
我初步學習了可尋址系統(tǒng)后,也算是對它有了一個了解。
Addressable Assets System 是由 Addressables和ResourceManager組成的系統(tǒng)!
Addressables和ResourceManager位于不同的包中
Addressables 依賴于 ResourceManager
在PackageManager中引入Addressables時,ResourceManager會自動包含
全部用C#編寫
ResourceManager是一個用于正確管理資源加載和卸載的框架
使用引用計數(shù)執(zhí)行卸載管理
DI可以定制加載過程等
它具有方便的功能,例如顯示資源加載情況的分析器
可尋址資源系統(tǒng)與AssetBundle的區(qū)別
1.可尋址資源系統(tǒng)只需要一個資源的地址就可以從任意地方進行加載,而AssetBundle需要從制定bundle中加載資源。
2.可尋址資源系統(tǒng)加載到內(nèi)存中的bundle有引用計數(shù),而AssetBundle加載到內(nèi)存中的bundle需要自己進行管理。
3.可尋址資源系統(tǒng)會自己管理依賴關(guān)系,而AssetBundle需要自己管理依賴關(guān)系,維護起來比較困難。
4.可尋址資源系統(tǒng)默認的所有加載操作都是異步操作,可以添加事件監(jiān)聽,而AssetBundle則有同步和異步加載。
4.Addressable系統(tǒng)怎么使用
1.Addressable Assets 窗口
第一次打開" Window -> Asset Management -> Addressable Assets "會需要新建一個Addressable 設(shè)置,默認資源分為兩組Build In Data,Default Local Group。前者不能改動,而后者我們可以在組里進行添加和刪除。我們也可以通過在Addressable Assets窗口右鍵再選中Create New Group-> Packed Assets來新建組。

2.標記資源
通過勾選預(yù)設(shè)/聲音等資源為可尋址資源。

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


目前好像還沒有把一個可尋址資源文件夾下面的所有資源都自動標記為可尋址資源,還是需要手動,如果有大佬知道的話可以拿出來看下!
3.加載資源
在我們添加好可尋址資源后,就可以在代碼中通過可尋址資源的地址來加載資源了。可尋址資源有3個模式可選擇

Fast Mode: 快速模式:直接加載文件而不打包,快速但Profiler獲取的信息較少;在此模式下,我們使用 AssetDatabase.LoadAssetAtPath 直接加載文件。雖然AssetBundle構(gòu)建可以不要求立即執(zhí)行的,它不能在探查證實,如果他們被列入其中AssetBundle資產(chǎn)。 Virtual Mode:虛擬模式:在不打包的情況下模擬靠近AssetBundle的操作;與FastMode不同,您可以查看哪個AssetBundle包含資產(chǎn)。此模式最終還加載了AssetDatabase.LoadAssetAtPath 。雖然AssetBundle構(gòu)建是沒有必要的,第一為了構(gòu)建AssetBundle和資產(chǎn)之間的對應(yīng)關(guān)系。還可以通過設(shè)置虛擬通信速度來模擬加載時間。Packed Mode:打包模式:實際上是從AssetBundle打包和加載;在這種模式下,實際構(gòu)建并加載AssetBundle。
通過key加載
void Start()
{
hand = Addressables.LoadAssetAsync<GameObject>("Cube");
hand.Completed += OnResLoadedHandler;
}
?
private void OnResLoadedHandler(AsyncOperationHandle<GameObject> obj)
{
GameObject go = obj.Result;
Instantiate(go);
}</pre>
我們可以直接通過 Addressables類的LoadAssetAsync接口來加載資源,參數(shù)為可尋址資源的地址。通過監(jiān)聽事件,在加載完成后完成實例化。
Addressables.InstantiateAsync("Cube");
我們也可以直接通過Addressables類的InstantiateAsync接口來直接實例化資源。
通過AssetReference加載
該AssetReference類提供了一個機制來訪問的資產(chǎn),而不需要知道的字符串(或其他方式)的地址。
要使用*AssetReference 類訪問可尋址資產(chǎn):
我們在繼承自monobehaviour的腳步中添加一個成員:
public AssetReference ar;
然后在該腳本組件的視圖中就可以選擇可尋址資產(chǎn)了。

這樣我們就無需知道該可尋址資源的地址也可以直接加載它。
我們也可以通過繼承AssetReference直接通過組件來加載資源。詳細方法可參考官方案例:
https://github.com/Unity-Technologies/Addressables-Sample/tree/master/Basic/ComponentReference
4.可尋址資產(chǎn)系統(tǒng)的加載
游戲?qū)ο髮嵗虞d,使用Addressables.InstantiateAsync。這將實例化傳入指定的預(yù)制件location。Addressables將加載Prefab及其依賴項,在該加載期間遞增所有項的引用計數(shù)。InstantiateAsync在同一地址上調(diào)用三次將導致所有依賴資產(chǎn)的ref-count為3。LoadAssetAsync調(diào)用三次則不同,每次InstantiateAsync呼叫都會AsyncOperationHandle指向一個獨特的操作。這是因為每個結(jié)果InstantiateAsync都是一個唯一的實例。InstantiateAsync和其他加載調(diào)用之間的另一個區(qū)別是可選參數(shù)trackHandle。如果將其設(shè)置為false,則必須保留AsyncOperationHandle在發(fā)布實例期間使用它。這樣更有效,但需要游戲開發(fā)人員付出更多努力。
游戲?qū)ο髮嵗遁d,使用Addressables.ReleaseInstance或關(guān)閉實例化對象所在的場景。此場景可能已加載(因此已關(guān)閉)Additive或Single模式。此場景也可以通過Addressables或SceneManagement加載。如上所述,如果設(shè)置trackHandle為false,則只能Addressables.ReleaseInstance使用句柄調(diào)用,而不能使用實際的GameObject 調(diào)用。
關(guān)于以下內(nèi)容的注釋Addressables.ReleaseInstance:如果您調(diào)用Addressables.ReleaseInstance的是未通過可尋址創(chuàng)建的實例,或者使用trackHandle = false創(chuàng)建的實例,我們會檢測Addressables.ReleaseInstance到該實例并返回false以指示它無法釋放傳遞給它的實例。
Addressables.InstantiateAsync有一些與之相關(guān)的開銷,所以如果你需要每幀100次實例化相同的對象,你應(yīng)該考慮通過Addressables加載,然后實例化外部的Addressables。在這種情況下,您可以調(diào)用Addressables.LoadAssetAsync,然后保存結(jié)果,并調(diào)用GameObject.Instantiate()該結(jié)果。這使您可以靈活地以同步方式調(diào)用Instantiate。缺點是我們不知道你創(chuàng)建了多少個實例。如果你打電話時還有漂浮的實例Addressables.Release,你可能會陷入糟糕的境地。例如,引用紋理的預(yù)制件將不再具有要引用的有效(加載)紋理,從而導致渲染問題(或更糟)。由于我們可能無法立即觸發(fā)內(nèi)存卸載(請參閱下面的“清除內(nèi)存時”),因此很難跟蹤這些類型的問題。
5.可尋址資產(chǎn)系統(tǒng)的Profiler
Window -> Asset Management -> Resource Profiler 打開。
此窗口的目的是向您顯示所有Addressables System操作的引用計數(shù)的狀態(tài)。這些操作包括資產(chǎn)包加載,資產(chǎn)加載等。
白色垂直線表示發(fā)生加載請求的幀。
藍色背景表示當前加載了有問題的資產(chǎn)。
圖表的綠色部分表示當前的重新計數(shù)。
以上就是我對可尋址資產(chǎn)系統(tǒng)的初步了解了。
我對addressable和ab做了更詳細的對比,有興趣的可以打開下面的文章
Addressable Asset System(進階版AB)和AssetBundle(以下簡稱AB)制作的資源管理系統(tǒng)的對比 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