Addressables學習筆記1: 資源加載


Addressables, 或稱AddressableAssets, 是Unity2018中新加入的一個資源管理體系。它基本上是已有的幾種資源加載方式的整合與改進。

原有的幾種資源加載方式如下:

 1 public class MyBehaviour : MonoBehaviour
 2 {
 3     public GameObject prefab;  //1.直接引用, 不需要寫代碼來載入
 4 
 5     private void Start()
 6     {
 7         GameObject go = Resources.Load<GameObject>("myPrefab"); //2.通過Resources載入
 8         GameObject otherGo = AssetBundle.LoadFromFile("myAssetBundlePath").LoadAsset<GameObject>("myPrefabName"); //3.通過AssetBundle載入
 9     }
10 }

方式1與方式2都不需要自己處理依賴關系,需要什么就載入什么,Unity自己會處理依賴關系,但是要求出游戲包的時候資源要包含在安裝包中;通過AB載入可以實現資源的熱更新、微端功能, 但是需要自己預先載入它依賴的其他資源,否則會導致引用丟失。

此外,三種方式的接口、使用方式全然不一致,而且還分成各種同步/異步接口,接口繁多;並且代碼和資源的位置是耦合的關系,想要將資源從Resources改為從AssetBundle加載需要更改代碼; 移動資源存放位置也會導致加載代碼失效。

為了解決這個問題,Unity2018中加入了新的資源管理系統: AddressableAssets。

它最大的改進是: 就算你將資源“路徑”寫死在代碼里,更改資源的存儲路徑/方式也無需對代碼做任何修改。

Addressables中常用的兩個方法是:

IAsyncOperation<TObject> Addressables.Instantiate<TObject>(object key, ...); //實例化一個對象
IAsyncOperation<TObject> Addressables.LoadAsset<TObject>(object key, ...); //加載一個資源

這兩個方法還有其他各種重載形式。

從返回值可以看出,這兩個操作都是異步的。

接口IAsyncOperateion<T> 定義如下:

namespace UnityEngine.ResourceManagement
{
    public interface IAsyncOperation<T> : IAsyncOperation, IEnumerator
    {
        T Result { get; }

        event Action<IAsyncOperation<T>> Completed;

        IAsyncOperation<T> Retain();
    }
}

因此如果需要在加載/實例化完成的時候進行某些操作,則需要像這樣處理:

string address = "MyAddress"; //要加載的資源的Key
Addressables.LoadAsset<GameObject>(address).Completed += 
    (op) => 
    {
        if (op.Status == UnityEngine.ResourceManagement.AsyncOperationStatus.Succeeded)
            Debug.Log(op.Result as GameObject);
    };

那么為什么Unity不光提供了LoadAsset<TObject>方法,還額外提供一系列Instantiate<TObject>呢?

這個問題下期再講。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM