前言
在前一篇 Unity Addressable 介紹了簡易使用的方式,此篇是介紹下載 Asset 方法。
目前我個人使用過的方式有 Name、Label、AssetReference、Array AssetReference 的方式。
Addressables.LoadAssetAsync
官方範例提供的下載方式 Addressables.LoadAsset(s)Async,雖然這個是要把 Asset 讀取出來,其實他也有下載功能
Addressables.LoadAssetAsync<GameObject>(asset);
我是很少使用這種方式下載或更新 Asset,主因是我個人認為 Addressables.LoadAssetAsync 是讀取物件而不是更新物件的功能,所以我在需要更新時不會使用它。
Update Addressable Name/ Addressable Label
IEnumerator UpdateAsset(string asset)
{
var downloadAsync = Addressables.DownloadDependenciesAsync(asset, false);
yield return downloadAsync;
Addressables.Release(downloadAsync);
}
這個是下載 Addressable Name
或 Label
的方法,可以利用 Label 下載多個不同 Group 的 Asset。
Addressable Name
、Label
是無法利用 Hotfix 的方式產生,所以是要先創好需要的。若假如需要新的 Addressable Name、Label 是必須要重新輸出
App 才會更新。
Update Asset Reference
IEnumerator UpdateAsset(AssetReference asset)
{
var downloadAsync = Addressables.DownloadDependenciesAsync(asset, false);
yield return downloadAsync;
Addressables.Release(downloadAsync);
}
AssetReference 的用法是我最推薦的下載方式,可以很明顯的知道更新物件,不會因為打錯文字導致更新失敗,而且也可以利用這個方式組合物件,讓更新的內容比較簡單方式處理。
例如用一個物件或場景夾帶了多個不同的需要更新的物件,缺點就是這包 pack 輸出會過大,可能需要把每個物件獨立分成多個 AssetReference,利用系統特性夾帶物件變小。不過要是不喜歡這種方式可以看 Update Multiple Asset References。
不過 AssetReference 最方便還是使用它來生成、釋放、等等,才是最好用的方式。
Update Multiple Asset References
IEnumerator DonwloadMultipleAssets(AssetReference[] assets)
{
var assetKeys = assets.Cast<AssetReference>();
var downloadAsync = Addressables.DownloadDependenciesAsync(assetKeys, Addressables.MergeMode.Union);
yield return downloadAsync;
Addressables.Release(downloadAsync);
}
多個 AssetReference 更新的方式,然後可以一起更新。可以完成一個簡單的多個物件更新,不用利用 Label、整合包、等方式更新。
取得下載容量大小方法
IEnumerator CheckSizeAsync(string asset)
{
var async = Addressables.GetDownloadSizeAsync(asset);
yield return async;
if (async.Status == AsyncOperationStatus.Succeeded)
{
float size = Mathf.Round((float)async.Result / 1024 / 1024 * 1000) / 1000;
Debug.Log($"Total {size} MB");
}
Addressables.Release(async);
}
更新進度條寫法
IEnumerator UpdateAsset(AssetReference asset)
{
var downloadAsync = Addressables.DownloadDependenciesAsync(asset, false);
while (!downloadAsync.IsDone)
{
float percent = downloadAsync.PercentComplete;
Debug.Log($"{asset}: {downloadAsync.PercentComplete * 100} %");
yield return new WaitForEndOfFrame();
}
Addressables.Release(downloadAsync);
}