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>呢?
这个问题下期再讲。
原文:https://www.cnblogs.com/thpGames/p/10348148.html