
·来源于唐老狮的视频教学,仅作记录和感悟记录,方便日后复习或者查找
一.Addressable是什么

是Unity中常被使用的一套可寻址资源管理系统,是对AssetBundle的更高一层封装


关于AssetBundle知识的补充:
①AB包可以通过自定义命名把资源分配到不同的包当中
②AB包打包到外面后会在不同平台生成不同的主包
③加载的时候,一个包只能加载一次,卸载的时候注意不要把场景中的也卸载
④对于单个资源的加载,直接用里面的API,来加载AssetBundle.LoadFromFile(包路径)
⑤建议的加载流程(同步加载):
- `先加载主包,
- `然后加载依赖包信息manifest = mainAB.LoadAsset<AssetBundleManifest>("AssetBundleManifest")。
- `然后获取里面目标包的依赖包名字string[]str = manifest.LoadAsset(targetABName)
- `然后逐个把这几个包也加载进来
- `最后再把目标包加载进来
⑥异步加载主要是对加载出来包后加载资源的时候异步加载,通过协程来实现异步等待,然后再通过带参数的回调函数把加载出的资源给传出去
⑦在网上查到了其它版本无法下载AssetBundles的解决办法,在资源管理器中打开Packages的manifest.json文件,在"dependencies": {}中添加一行代码:"com.unity.assetbundlebrowser": "1.7.0",
保存一下就好啦,也不需要下载,直接就可以打开AssetBundles的窗口
二.导入Addressable与添加资源
1.导入Addressable

要使用Addressable,我们就需要先去PacagaeManager中下载该插件

然后我们可以这样打开一个窗口

点击【Create Addressable Setting】,之后就会生成相关的资源容器来进行资源的装载

它会在Asset下生成这样一个配置文件夹,里面都是ScriptableObject
这里的模式从上到下依次是:使用Asset资源(就是平常我们使用的),模拟AB包,使用真实AB包。一般测试的时候我们选第二种即可,要真实发布前使用第三种
2.添加资源

我们可以通过点击这个New显示下拉菜单来创建新的组(可以当成是新的文件夹这样理解,不过总是会存在一个默认文件夹,这里是Default Local Group(Default),当我们没有给资源设置组的时候,就默认先放在这里)
有两种方法来把资源添加为可寻址资源(注意C#脚本无法被作为可寻址资源):
2.1.直接拖入

直接把需要的资源拖入对应的组中即可
2.2.面板窗口上打勾

直接点击这个资源之后,在它的面板窗口上我们可以可以看到对应的资源
三. 在代码中获取与使用资源
1.资源引用变量名
我们可以通过在脚本中声明相关的引用变量从而在外部去设置它
cs
public AssetReference assetReference; //资源引用
public AssetReferenceAtlasedSprite asReference; //图集引用
public AssetReferenceGameObject gameObjectReference; //物体引用
public AssetReferenceSprite spriteReference; //精灵引用
public AssetReferenceTexture texReference; //纹理引用
public AssetReferenceT<AudioClip> cilpReference; //音效引用
public AssetReferenceT<RuntimeAnimatorController> animatorReference; //动画控制器引用
①AssetReference是指所有类型的资源引用,而其他的都是指向具体类型的资源引用。其中用泛型来指定引用的资源的是最为简洁统一的方法。

然后我们可以在检查面板中设置相应的资源即可
2.异步加载资源
2.1.加载资源引用
cs
//加载一个立方体到场景中
assetReference.LoadAssetAsync<GameObject>().Completed += (handle) => {
//如果当前句柄的状态为已完成,则加载出该资源
if (handle.Status == AsyncOperationStatus.Succeeded) {
GameObject obj = Instantiate(handle.Result);
//直接从引用直接释放资源
//assetReference.ReleaseAsset();
//handle.ReleaseHandleOnCompletion();
}
};
//加载并使用音效
cilpReference.LoadAssetAsync<AudioClip>().Completed += (handle) => {
if (handle.Status == AsyncOperationStatus.Succeeded) {
AudioSource.PlayClipAtPoint(handle.Result, transform.position);
//直接从引用释放资源
//cilpReference.ReleaseAsset();
//handle.ReleaseHandleOnCompletion();
}
};
①这里加载引用资源,通过LoadAssetAsync方法来实现异步加载
②它会返回一个异步加载句柄,我们可以通过Completed事件来获取加载完毕之后的资源
③是否加载完成我们通过handle.Status == AsyncOperationStatus.Succeeded来判断
④这里我们获取了资源之后是引用类型的,所以如果我们直接给他卸载掉了会导致其丢失引用,所以我们这里使用完毕后先不要卸载资源。
注意:模式要调到真实使用AB包才看得出直接卸载会导致的后果
2.2.加载场景
cs
//加载场景
sceneReference.LoadSceneAsync().Completed += (handle) => {
print("场景加载完毕");
//handle.ReleaseHandleOnCompletion();
};
①注意加载场景的时候如果选择了用真实AB包模式,需要保证AB包中的场景和当前编辑器中的场景是一致的(就是如果资源里的场景更新了的话,要再打包出去一次)
2.3.加载资源实例
cs
//直接实例化对象
gameObjectReference.InstantiateAsync().Completed += (handle) => {
if(handle.Status == AsyncOperationStatus.Succeeded) {
print("成功实例化对象" + handle.Result.name);
handle.Result.transform.position += Vector3.up * 2;
}
};
①只适用于 想要实例化的 对象 才会直接使用该方法 一般都是GameObject预设体
3.其他

目前新版本都用泛型指定对应类型的引用资源即可,这里仅作了解
四.总结
①Addressable是对AssetBundle的更高一层抽象封装,提供了更智能便捷和全面的资源管理系统
②我们可以给资源设置不同的组,可以给通过直接拖入或者检视面板中勾选的方式来把资源设置为可寻址资源(注意如果资源在Resources文件夹里面,会问你是否移动到Resources_Move文件夹中,一般选是,因为Resources文件夹在最后打包出去是不可写的)
③我们可以在代码中通过资源引用变量来使用不同的寻址资源,并通过代码把它们获取到,或者实例化,或者切换场景。如果使用完卸载掉了之后,引用类型的资源也会跟着被清理
④卸载资源的时候,资源引用变量中的资源会被移除,但是句柄中的资源还会保留着(释放资源方法后,资源标识类中的资源会置空,但是AsyncOperationHandle类中的对象不为空)