Unity新出資源管理系統-Addressable Asset

1.什麼是Addressable(可尋址資產)系統

可尋址資產系統提供了一種通過“地址”加載資產的簡便方法。它通過簡化內容包的創建和部署來處理資產管理開銷。可尋址資產系統使用異步加載來支持從任何位置加載任何依賴項集合。

一旦資產被標記爲“可尋址”,就可以從任何地方調用可尋址資產。無論該可尋址資產是駐留在本地播放器還是內容傳送網絡上,系統都將找到並返回它。您可以通過其地址加載單個可尋址,或使用您定義的自定義組標籤加載許多可尋址。

2.爲什麼要推出Addressable系統

  • 迭代時間:通過其地址引用內容是超級高效的。使用地址引用,只會檢索內容。對內容的優化不再需要更改代碼。

  • 依賴關係管理:系統不僅返回地址的內容,還返回該內容的所有依賴關係。系統會在整個資產準備就緒時通知您,因此在返回內容之前會加載所有網格,着色器,動畫等。

  • 內存管理:該地址不僅可以加載資產,還可以卸載它們。引用會自動計算,強大的分析器可幫助您發現潛在的內存問題。

  • 內容打包:由於系統映射並理解複雜的依賴關係鏈,因此即使在移動或重命名資產時,它也可以有效地打包捆綁包。可以爲本地和遠程部署輕鬆準備資產,以支持可下載內容(DLC)和減少應用程序大小。

3.Addressable系統對比AssetBundle有什麼區別

我初步學習了可尋址系統後,也算是對它有了一個瞭解。

Addressable Assets System 是由 Addressables和ResourceManager組成的系統!

  • Addressables和ResourceManager位於不同的包中
  • Addressables 依賴於 ResourceManager
  • 在PackageManager中引入Addressables時,ResourceManager會自動包含
  • 全部用C#編寫

ResourceManager是一個用於正確管理資源加載和卸載的框架

  • 使用引用計數執行卸載管理
  • DI可以定製加載過程等
  • 它具有方便的功能,例如顯示資源加載情況的分析器

可尋址資源系統與AssetBundle的區別

1.可尋址資源系統只需要一個資源的地址就可以從任意地方進行加載,而AssetBundle需要從制定bundle中加載資源。

2.可尋址資源系統加載到內存中的bundle有引用計數,而AssetBundle加載到內存中的bundle需要自己進行管理。

3.可尋址資源系統會自己管理依賴關係,而AssetBundle需要自己管理依賴關係,維護起來比較困難。

4.可尋址資源系統默認的所有加載操作都是異步操作,可以添加事件監聽,而AssetBundle則有同步和異步加載。

4.Addressable系統怎麼使用

1.Addressable Assets 窗口

第一次打開" Window -> Asset Management -> Addressable Assets "會需要新建一個Addressable 設置,默認資源分爲兩組Build In Data,Default Local Group。前者不能改動,而後者我們可以在組裏進行添加和刪除。我們也可以通過在Addressable Assets窗口右鍵再選中Create New Group-> Packed Assets來新建組。
在這裏插入圖片描述

2.標記資源

通過勾選預設/聲音等資源爲可尋址資源。
在這裏插入圖片描述
然後在Addressable Assets面板上就會有它選中後的狀態。

在這裏插入圖片描述
在這裏插入圖片描述

3.加載資源

在我們添加好可尋址資源後,就可以在代碼中通過可尋址資源的地址來加載資源了。可尋址資源有3個模式可選擇
在這裏插入圖片描述

  • Fast Mode: 快速模式:直接加載文件而不打包,快速但Profiler獲取的信息較少;在此模式下,我們使用
    AssetDatabase.LoadAssetAtPath直接加載文件。雖然AssetBundle構建可以不要求立即執行的,它不能在探查證實,如果他們被列入其中AssetBundle資產。
  • VirtualMode:虛擬模式:在不打包的情況下模擬靠近AssetBundle的操作;與FastMode不同,您可以查看哪個AssetBundle包含資產。此模式最終還加載了AssetDatabase.LoadAssetAtPath 。雖然AssetBundle構建是沒有必要的,第一爲了構建AssetBundle和資產之間的對應關係。還可以通過設置虛擬通信速度來模擬加載時間。
  • Packed Mode:打包模式:實際上是從AssetBundle打包和加載;在這種模式下,實際構建並加載AssetBundle。
通過key加載
void Start()
{
hand = Addressables.LoadAssetAsync<GameObject>("Cube");
hand.Completed += OnResLoadedHandler;
}private void OnResLoadedHandler(AsyncOperationHandle<GameObject> obj)
{
GameObject go = obj.Result;
Instantiate(go);
}

我們可以直接通過 Addressables類的LoadAssetAsync接口來加載資源,參數爲可尋址資源的地址。通過監聽事件,在加載完成後完成實例化。

Addressables.InstantiateAsync("Cube");

我們也可以直接通過Addressables類的InstantiateAsync接口來直接實例化資源。

通過AssetReference加載

AssetReference類提供了一個機制來訪問的資產,而不需要知道的字符串(或其他方式)的地址。

要使用*AssetReference 類訪問可尋址資產:

我們在繼承自monobehaviour的腳步中添加一個成員:

public AssetReference ar;

然後在該腳本組件的視圖中就可以選擇可尋址資產了。
在這裏插入圖片描述
這樣我們就無需知道該可尋址資源的地址也可以直接加載它。

我們也可以通過繼承AssetReference直接通過組件來加載資源。詳細方法可參考官方案例:

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

4.可尋址資產系統的加載

遊戲對象實例化要加載,使用Addressables.InstantiateAsync。這將實例化傳入指定的預製件location。Addressables將加載Prefab及其依賴項,在該加載期間遞增所有項的引用計數。InstantiateAsync在同一地址上調用三次將導致所有依賴資產的ref-count爲3。LoadAssetAsync調用三次則不同,每次InstantiateAsync呼叫都會AsyncOperationHandle指向一個獨特的操作。這是因爲每個結果InstantiateAsync都是一個唯一的實例。InstantiateAsync和其他加載調用之間的另一個區別是可選參數trackHandle。如果將其設置爲false,則必須保留AsyncOperationHandle在發佈實例期間使用它。這樣更有效,但需要遊戲開發人員付出更多努力。

遊戲對象實例化要卸載,使用Addressables.ReleaseInstance或關閉實例化對象所在的場景。此場景可能已加載(因此已關閉)Additive或Single模式。此場景也可以通過Addressables或SceneManagement加載。如上所述,如果設置trackHandle爲false,則只能Addressables.ReleaseInstance使用句柄調用,而不能使用實際的GameObject 調用。

關於以下內容的註釋Addressables.ReleaseInstance:如果您調用Addressables.ReleaseInstance的是未通過可尋址創建的實例,或者使用trackHandle = false創建的實例,我們會檢測Addressables.ReleaseInstance到該實例並返回false以指示它無法釋放傳遞給它的實例。

Addressables.InstantiateAsync有一些與之相關的開銷,所以如果你需要每幀100次實例化相同的對象,你應該考慮通過Addressables加載,然後實例化外部的Addressables。在這種情況下,您可以調用Addressables.LoadAssetAsync,然後保存結果,並調用GameObject.Instantiate()該結果。這使您可以靈活地以同步方式調用Instantiate。缺點是我們不知道你創建了多少個實例。如果你打電話時還有漂浮的實例Addressables.Release,你可能會陷入糟糕的境地。例如,引用紋理的預製件將不再具有要引用的有效(加載)紋理,從而導致渲染問題(或更糟)。由於我們可能無法立即觸發內存卸載(請參閱下面的“清除內存時”),因此很難跟蹤這些類型的問題。

5.可尋址資產系統的Profiler

Window -> Asset Management -> Resource Profiler 打開。

此窗口的目的是向您顯示所有Addressables System操作的引用計數的狀態。這些操作包括資產包加載,資產加載等。

  • 白色垂直線表示發生加載請求的幀。
  • 藍色背景表示當前加載了有問題的資產。
  • 圖表的綠色部分表示當前的重新計數。
    Addressable Asset System(進階版AB)和AssetBundle(以下簡稱AB)製作的資源管理系統的對比 https://www.jianshu.com/p/8009c16fcab3

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

https://docs.unity3d.com/Packages/[email protected]/manual/index.html

Unity官方可尋址資產系統案例:https://github.com/Unity-Technologies/Addressables-Sample

作者:右先生zzz
轉載自:https://www.jianshu.com/p/e79b2eef97bf
來源:簡書

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章