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>呢?

这个问题下期再讲。

猜你喜欢

转载自www.cnblogs.com/thpGames/p/10348148.html