转载自己学习 https://blog.csdn.net/zhenghongzhi6/article/details/103334939
Addressable系统的加载资源API
Addressable中加载资源主要有两个途径:

通过AssetReference加载
使用Addressables类中的静态方法通过地址/Label加载
1.AssetReference加载的API
使用AssetReference类访问Addressable资产时无需知道他们的地址字符串,但是需要在Inspector上关联。使用流程如下:

新建一个脚本,任何可序列化的组件都支持AssetReference变量(例如,继承MonoBehaviour的脚本,ScriptableObject或其他可序列化的类)。
在组件中添加一个AssetReference类型的公共变量(例如public AssetReference explosion;)。
在Inspector中,将资产从“ Project”窗口拖到AssetReference字段上(非Addressable资产也可以拖,会自动标记为Addressable),或从项目中已经设置的可寻址资产的下拉列表中进行选择(如下所示)。
通过脚本组件引用可寻址资产

要加载或实例化AssetReference资产,需要调用其相应的方法。例如:

仅加载到内存中,多用于贴图、材质、动画、音频等资产:

[AssetReference的变量名].LoadAssetAsync();
1
直接实例化到场景中,一般用于Prefab:

[AssetReference的变量名].InstantiateAsync(pos, rot);

加载场景:

[AssetReference的变量名].LoadSceneAsync();
1
注:这几个API都是异步操作,异步操作详解在大智的教程中有(洪流学堂公众号中回复addr可以获取),在这就不多说了。

  1. 使用Addressables类中的静态方法通过地址/Label加载
    Addressables类中有加载单个资源的API和多个资源的API。

加载单个资源
在脚本中使用字符串地址加载资产,先声明using UnityEngine.AddressableAssets;名称空间,然后调用以下方法:

仅加载到内存中,多用于贴图、材质、动画、音频等资产:

Addressables.LoadAssetAsync(“AssetAddress”);

加载完成后并不会将所需的资产实例化到场景中。要将资产添加到场景中,还需要一步:实例化。

还有一个加载和实例化二合一的接口,这个接口会加载资产,然后立即将其实例化到场景中:

Addressables.InstantiateAsync(“AssetAddress”);

这会将指定地址的资产实例化到场景中。

注意:上面的API是异步操作。你可以在资产完成加载后提供一个回调来使用资产,异步操作详解在大智的教程中有(洪流学堂公众号中回复addr可以获取),在这就不多说了。

using System.Collections;
using System.Collections.Generic;
using UnityEngine.AddressableAssets;
using UnityEngine;

public class AddressablesExample : MonoBehaviour {

GameObject myGameObject;

void Start{
    Addressables.LoadAssetAsync<GameObject>("AssetAddress").Completed += OnLoadDone;
}

private void OnLoadDone(UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationHandle<GameObject> obj)
{
    // In a production environment, you should add exception handling to catch scenarios such as a null result.
    myGameObject = obj.Result;
}

}

一次加载多个资产
一次加载多个资产通常是使用Label加载。

如上图所示的分组策略,可以按如下方式加载HD的皮肤贴图。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;

public class TextureController : MonoBehaviour
{
public Renderer m_ReferencedMaterial;

public void SwitchToHighDef()
{
    LoadTexture("ArcherColor", "HD");
}

void LoadTexture(string key, string label)
{
    Addressables.LoadAssetsAsync<Texture2D>(new List<object> { key, label }, null, Addressables.MergeMode.Intersection).Completed
        += TextureLoaded;
}

void TextureLoaded(AsyncOperationHandle<IList<Texture2D>> obj)
{
    m_ReferencedMaterial.material.mainTexture = obj.Result[0];
}

}

在这一定要注意:LoadAssetsAsync有三个重载:

public static AsyncOperationHandle<IList> LoadAssetsAsync(object key, Action callback);
public static AsyncOperationHandle<IList> LoadAssetsAsync(IList keys, Action callback, MergeMode mode);
public static AsyncOperationHandle<IList> LoadAssetsAsync(IList locations, Action callback);

通常我们使用前两种重载:

第一种:用于加载单个标签或地址。

第二种:用于加载地址+标签的形式。用第二种时一定要注意加上第三个参数MergeMode。否则重载匹配时就会去匹配第一个重载,会导致找不到资源。

MergeMode是什么呢?翻译过来是合并模式。

public enum MergeMode
{
None = 0,
UseFirst = 0,
Union,
Intersection
}

采用第二种重载加载时,其实会去先查询每一个地址/标签对应的资源,然后再根据MergeMode进行最终结果的计算。

举个栗子:

比如传入的参数是new List{“cube”, “red”},根据cube查询出来的资源有A、B、D,根据red查询出来的资源有C、D、E。

那么MergeMode是Node或UseFirst时,会取第一个key查询到的资源:A、B、D;

MergeMode是Union时,会取所有key查询到的资源的并集:A、B、C、D、E;

MergeMode是Intersection时,会取所有key查询到的资源的交集:D。

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐