主要是實作 Addressable hotfix 的寫法。
想知道 Addressable 下載方式看這篇。 想知道 Addressable 讀取、釋放方式看這篇。
基本 Unity-Addressable 安裝及 Remote 設定可以參考這篇 Unity筆記 Addressable Asset System。
詳細解說可以參考
Unity Addressables 深入浅出(一)、(二)、(三)
Initial Addressable System 是必要
的假如不初始化會造成一些使用上的問題。
在 Start 上可直接初始化 Addressable System
IEnumerator Start()
{
var InitAddressablesAsync = Addressables.InitializeAsync();
yield return InitAddressablesAsync;
}
Catalog 是所有檔案的紀錄檔(log),不更新 Catalog 也是能下載 Asset,可是會造成無法 hotfix,所以需要再下載前更一次 Catalog。
依 Window 為例,Catalog 更新後會放自動放置在
C:\Users\[PC Name]\AppData\LocalLow\[Company Name]\[Product Name]\com.unity.addressables
名稱 | 解釋 |
---|---|
[PC Name] | 系統使用者名稱 |
[Company Name] | Unity 專案 Company Name |
[Product Name] | Unity 專案 Product Name |
IEnumerator UpdateCatalogCoro()
{
List<string> catalogsToUpdate = new List<string>();
var checkCatalogHandle = Addressables.CheckForCatalogUpdates();
yield return checkCatalogHandle;
if (checkCatalogHandle.Status == AsyncOperationStatus.Succeeded)
catalogsToUpdate = checkCatalogHandle.Result;
if (catalogsToUpdate.Count > 0)
{
var updateCatalogHandle = Addressables.UpdateCatalogs(catalogsToUpdate, false);
yield return updateCatalogHandle;
}
}
下載好的 Asset,在測試時不清除是會造成無法測試下載流程,可是可以手動清除下載 Asset。
依 Window 為例,下載好的 Asset 更新後會放自動放置在
C:\Users\[PC Name]\AppData\LocalLow\Unity\[Company Name]_[Product Name]
名稱 | 解釋 |
---|---|
[PC Name] | 系統使用者名稱 |
[Company Name] | Unity 專案 Company Name |
[Product Name] | Unity 專案 Product Name |
這個方式是使用 AA 系統紀錄 Catalog 取得出來的位置(Locator),在使用 GetDownloadSizeAsync
來確認檔案有無更新,來達成更新所有檔案。
IEnumerator UpdateAllGroupsCoro()
{
foreach (var loc in Addressables.ResourceLocators)
{
foreach (var key in loc.Keys)
{
var sizeAsync = Addressables.GetDownloadSizeAsync(key);
yield return sizeAsync;
long totalDownloadSize = sizeAsync.Result;
if (sizeAsync.Result > 0)
{
var downloadAsync = Addressables.DownloadDependenciesAsync(key);
while (!downloadAsync.IsDone)
{
float percent = downloadAsync.PercentComplete;
Debug.Log($"{key} = percent {(int)(totalDownloadSize * percent)}/{totalDownloadSize}");
yield return new WaitForEndOfFrame();
}
Addressables.Release(downloadAsync);
}
Addressables.Release(sizeAsync);
}
}
}
這個方式是使用 Label 下載特定資源。
IEnumerator UpdateLabelAsset(string label)
{
long updateLabelSize = 0;
var async = Addressables.GetDownloadSizeAsync(label);
yield return async;
if (async.Status == AsyncOperationStatus.Succeeded)
updateLabelSize = async.Result;
Addressables.Release(async);
if (updateLabelSize == 0)
{
Debug.Log($"{label} last version");
yield break;
}
yield return DownloadLabelAsset(label);
}
IEnumerator DownloadLabelAsset(string label)
{
var downloadAsync = Addressables.DownloadDependenciesAsync(label, false);
while (!downloadAsync.IsDone)
{
float percent = downloadAsync.PercentComplete;
Debug.Log($"{label}: {downloadAsync.PercentComplete * 100} %");
yield return new WaitForEndOfFrame();
}
Addressables.Release(downloadAsync);
Debug.Log($"{label} UpdateAssets finish");
}
刪除 Asset Path 路徑下載的檔案。
Caching.ClearCache()
是能夠完整的清除下載的所有檔案,但是不能單獨使用,還要搭配 Addressables.ClearDependencyCacheAsync
才能清除 Catalog 紀錄的下載資訊。
IEnumerator ClearAllAssetCoro()
{
foreach (var locats in Addressables.ResourceLocators)
{
var async = Addressables.ClearDependencyCacheAsync(locats.Keys, false);
yield return async;
Addressables.Release(async);
}
Caching.ClearCache();
}
IEnumerator ClearAssetCoro(string label)
{
var async = Addressables.LoadResourceLocationsAsync(label);
yield return async;
var locats = async.Result;
foreach (var locat in locats)
Addressables.ClearDependencyCacheAsync(locat.PrimaryKey);
}