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>呢?
這個問題下期再講。