概论
当不再需要Addressable的实例时,应通过Addressables.ReleaseInstance 释放它,或在包含它的场景关闭时允许其自动清理,而不是通过Destroy 或DestroyImmediate 破坏其GameObject 。如果不再需要资产本身,则将其卸载。
每次通过可寻址对象加载或实例化可寻址资产时,其引用(ref)计数以及包含它的捆绑软件的ref计数都会增加。为了保持平衡,所有负载或实例都应具有成对的释放。
因为任何内容(甚至是目录)都可以远程存储,并且许多因素(例如内容大小,连接速度和/或存储介质)可以影响加载内容所需的时间,所以Addressables系统必然是异步的。开发人员可以通过三种方法来了解对Addressables的调用何时完成:回调(特别是Completed ,它返回与调用的性质有关的AsyncOperationHandle ,和CompletedTypeless ,它返回无类型的AsyncOperationHandle ),协程或AsyncAwait 。
加载或下载可寻址资产和/或其依存关系时,将对其进行缓存。标有“静态”的AssetBundle仅下载一次。加载可寻址资产会将其放置在内存中,但不会自动实例化它。指定地址或标签的所有依赖项也可以在必要时预加载。
传统上,每个资产的捆绑分配都存储在其元数据中,而与可寻址对象相关的数据则存储在AddressableAssetsData 文件夹中。您可以在“可寻址”窗口中创建此文件夹,或者在您首次使资产可寻址时将自动创建该文件夹-通过选中检查器中的复选框,或将其拖到“资产”组中。
开始
- 下载
配置
就会看到配置的inspector:
添加新的配置:
代码生成实例对象
使用AssetReference生成对象
using UnityEngine;
using System.Collections;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
public class Adressables : MonoBehaviour
{
public AssetReference objectToLoad;
public AssetReference accessoryObjectToLoad;
private GameObject instantiatedObject;
private GameObject instantiatedAccessoryObject;
// Use this for initialization
void Start()
{
Addressables.LoadAssetAsync<GameObject>(objectToLoad).Completed += ObjectLoadDone;
}
// Update is called once per frame
void Update()
{
}
private void ObjectLoadDone(AsyncOperationHandle<GameObject> obj)
{
if (obj.Status == AsyncOperationStatus.Succeeded)
{
GameObject loadedObject = obj.Result;
Debug.Log("Successfully loaded object.");
instantiatedObject = Instantiate(loadedObject);
Debug.Log("Successfully instantiated object.");
if (accessoryObjectToLoad != null)
{
accessoryObjectToLoad.InstantiateAsync(instantiatedObject.transform).Completed += op =>
{
if (op.Status == AsyncOperationStatus.Succeeded)
{
instantiatedAccessoryObject = op.Result;
Debug.Log("Successfully loaded and instantiated accessory object.");
}
};
}
}
}
}
对要加载的物体勾选可寻址选项:
我这里讲自带的两个预制体物体打上了√
新建场景做加载测试
在摄像机上面挂载刚刚写的c#脚本