一,兩種資源加載方式對比
-
加載方式:
- Resources 使用同步加載方式;Resources 加載資源時,應(yīng)用程序?qū)蛔枞钡劫Y源加載完成,這可能會導(dǎo)致應(yīng)用程序出現(xiàn)卡頓或掛起的情況。
- Addressables 使用異步加載方式。這意味著使用 Unity 而使用 Addressables 加載資源時,應(yīng)用程序可以繼續(xù)運(yùn)行,而不會出現(xiàn)卡頓或掛起的情況。
-
動態(tài)加載:
- Resources 只能從項目的 Assets 文件夾中加載資源,只能在編譯時加載資源。
- Addressables 可以在運(yùn)行時動態(tài)加載資源,從而實現(xiàn)更靈活的資源管理。
-
資源管理:
- Resources 只能帶在安裝包中,資源過多的情況下,會增大包體。
- Addressables 可以從本地或遠(yuǎn)程服務(wù)器加載資源,并可以通過 Addressables Group 進(jìn)行靈活的資源管理和打包。
-
資源更新:
- Resources 中的資源只能通過重新打包應(yīng)用程序來更新
- Addressables 可以通過簡單的資源更新或替換來更新應(yīng)用程序中的資源,而無需重新打包整個應(yīng)用程序。
綜上所述,Addressables 比 Resources 更靈活、更高效、更可靠,特別是在處理大量或較大的資源時,Addressables 的異步加載和靈活資源管理功能能夠大大提高應(yīng)用程序的性能和可擴(kuò)展性。但是,在加載少量或較小的資源時,使用 Resources 會更簡單和方便。
二,將Resource項目轉(zhuǎn)為Addressables
2.1 實現(xiàn)邏輯
- 當(dāng)一個
Resources
文件夾內(nèi)的資源被標(biāo)記為Addressable
時,系統(tǒng)會自動將它從Resources
文件夾移動到Resources_moved
的新文件夾中。 - 若有多層目錄,系統(tǒng)也會保留,同步在
Resources_moved
的新文件夾中創(chuàng)建和Resources
中的目錄結(jié)構(gòu) - 被標(biāo)記的資源可尋址路徑(加載路徑Key),也會使用Resources目錄下的目錄結(jié)構(gòu)。
- 原來的加載代碼會從
Resources.Load<GameObject>("CZY/Czhenya.prefab")
變成Addressables.LoadAssetAsync<GameObject>("CZY/Czhenya.prefab")
- 若工程中有使用
public GameObject Czhenya;
這種公開變量拖拽賦值的情況,
只需將定義代碼修改為public AssetReference Czhenya;
。
實例化Instaniate()
修改為AssetRefName.InstantiateAsync();
需要注意的是: 移動后的路徑Key使用在Resources文件夾下的目錄命名。而在Resources文件夾下加載資源時路徑名稱是不區(qū)分大小寫的,而AA的路徑Key是需要區(qū)分大小寫的。
分享一個工具腳本:
可導(dǎo)入下面腳本到工程中,而后只需將工程中的Resources.Load
修改 為 AAResources.Load
即可完成資源加載方式的轉(zhuǎn)換。
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
public class AAResources
{
/// <summary>
/// 可尋址資源加載
/// 強(qiáng)制同步加載GameObject的基本用法
/// </summary>
/// <param name="pathKey">路徑key</param>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public static T Load<T>(string pathKey)
{
var op = Addressables.LoadAssetAsync<T>(pathKey);
T go = op.WaitForCompletion();
if (op.Status == AsyncOperationStatus.Failed)
{
Debug.LogError($"加載資源失敗,路徑:{pathKey},異常 {op.OperationException}");
return default(T);
}
return go;
}
}
注意:這種同步加載的方式在WebGL上是不支持的,在其他平臺是沒問題的。
異步寫法如下:
public async Task<T> LoadAssetAsync<T>(string pathKey) where T : UnityEngine.Object
{
AsyncOperationHandle<T> handle = Addressables.LoadAssetAsync<T>(pathKey);
await handle.Task;
return handle.Result;
}
Addressable代碼加載的其他方式,可以參考:Unity 之 Addressable可尋址系統(tǒng) – 代碼加載介紹 – 進(jìn)階(一)
2.2 操作步驟
將Unity資源加載方式從Resources修改到Addressables需要進(jìn)行以下步驟:
-
安裝
Addressables
包:在 Unity 的Package Manager
中安裝Addressables
包,以便在項目中使用Addressables
相關(guān)功能。 -
配置
Addressables
:在 Unity 的菜單欄中選擇Window -> Asset Management -> Addressables -> Groups
,創(chuàng)建一個新的Addressables Group
并將所需的資源添加到其中。 -
修改代碼:修改引用
Resources
加載方式的代碼,改為使用Addressables
加載資源。您可以使用Addressables.LoadAssetAsync
方法來異步加載資源,或者使用Addressables.LoadAsset
方法來同步加載資源。
三,使用Addressables的注意事項
在使用Addressables加載資源時,需要注意資源的生命周期和線程安全問題,下面是一些處理方法:
-
生命周期管理:在使用Addressables加載資源后,需要注意資源的生命周期問題,以免資源泄漏或者被意外釋放。一般來說,可以使用AsyncOperationHandle.Release()方法來釋放加載的資源。在釋放資源之前,需要確保所有的引用都已經(jīng)被釋放了,否則會導(dǎo)致資源泄漏。如果資源被多次加載,需要在所有的引用都釋放之后,再調(diào)用Release()方法釋放資源。
-
線程安全:在使用Addressables加載資源時,需要注意線程安全問題,以免出現(xiàn)競態(tài)條件和其他線程問題。一般來說,可以使用異步加載的方式來避免線程問題。如果需要在主線程中訪問異步加載的結(jié)果,可以使用Unity的協(xié)程(Coroutine)來處理異步操作,并在協(xié)程中訪問異步加載的結(jié)果。另外,需要注意在異步加載的回調(diào)函數(shù)中,不要直接修改Unity對象的屬性或者調(diào)用Unity API,否則會導(dǎo)致線程問題。如果需要在回調(diào)函數(shù)中修改Unity對象的屬性或者調(diào)用Unity API,需要使用Unity的主線程調(diào)用(MainThreadDispatcher)來確保線程安全。
-
錯誤處理:在使用Addressables加載資源時,需要注意錯誤處理問題,以免出現(xiàn)未處理的異常和錯誤信息。一般來說,可以使用AsyncOperationHandle.OperationException屬性獲取異步操作的錯誤信息,并對錯誤進(jìn)行處理。如果出現(xiàn)異常,可以使用try-catch語句來捕獲并處理異常。需要注意的是,在異步操作中,異常和錯誤信息可能會被延遲到異步操作完成后才能被捕獲和處理,所以需要在異步操作完成后再進(jìn)行錯誤處理。
四,使用中遇到問題
報錯:
UnityEngine.AddressableAssets.InvalidKeyException: Exception of type ‘UnityEngine.AddressableAssets.InvalidKeyException’ was thrown., Key=Sound, Type=UnityEngine.AudioClip
可能原因:
-
檢查指定的組名稱是否正確,需要保證與Addressable系統(tǒng)中的組名稱一致,包括大小寫。可以在Addressables窗口中查看所有的組名稱和其中的資源。
-
檢查指定的組中是否存在指定的資源,需要保證資源名稱與Addressable系統(tǒng)中的名稱一致,包括大小寫。
-
檢查指定的資源類型是否正確,需要保證與實際使用的資源類型一致。例如,如果需要加載的是音頻資源,需要使用Addressables.LoadAssetsAsync而不是Addressables.LoadAssetsAsync。文章來源:http://www.zghlxwxcb.cn/news/detail-454386.html
-
如果使用了Addressables的標(biāo)簽(label)功能,需要保證指定的標(biāo)簽名稱與實際使用的標(biāo)簽名稱一致,包括大小寫。文章來源地址http://www.zghlxwxcb.cn/news/detail-454386.html
到了這里,關(guān)于Unity 之 Addressable可尋址系統(tǒng) -- 將Resources加載資源方式修改為Addressable加載 -- 實戰(zhàn)(一)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!