这里写目录标题
- 一、什么是Addresables
- 二、导入Addressables
- 三、创建Addressables Settings 资产包管理
- 四、资源集合Group的基本操作(资源分包)
- 五、设置远程资源包
- 六、如何打包
- 七、加载方式
- 7-1. Mono脚本指定和实例化:
- 7-2. 直接实例化指定物体
- 7-3.异步回调加载
- 7-4.异步直接实例化
- 7-5.使用 async 、await的方式
- 7-6.加载场景
- 八、加载环境模拟
- 1. Use Asset Database (fastest)
- 2. Simulate Groups (advanced)
- 3. Use Exising Build(requires built groups)
- 九、查看引用分析面板
- 十、Hosting Service 本地服务器
- 十一、查看重复资源
- 十一、WebGL平台问题
- 十二、Unity版本选择
- 十三、资源释放
一、什么是Addresables
Unity Addressable Asset system
提供了一个可以随着您的项目而增长的系统,无需编程即可以取代AssetBundle管理资源。
具备自分配地址功能,使用到时自动寻址加载、自动对本地移动资源进行跟踪并处理依赖关系。
二、导入Addressables
1.点击 Windows > PackageManager
2.搜索 Addressables
,并导入插件
3.Unity要求使用2019以后版本
注:实际项目中,建议大家下载 Addressables.CN
版本。
三、创建Addressables Settings 资产包管理
1.点击 Windows > Asset Management > Addressables > Groups
2.在弹出的 Addressables Group
窗口中点击 Create Addressables Settings
按钮,创建 AddressablesAssetsData
此时默认创建了一个组 Default Local Group (Default)
, Addressable
默认按**Group
**为节进行AssetBundle打包
即,此界面中可以创建多个 Group
,可存放资源,即会按 Group
为生成 AssetBundle.
3.创建 Addressable Settings
时工程中也会生成一个 AddressableAssetsData
文件夹,里面有很多设置文件。
四、资源集合Group的基本操作(资源分包)
1.在 Addressables Group
中可以通过点击空白处,创建新的 Group
,可用做包外资源组(远程资源包)
2.通过右键 Rename
可以修改 Group
名字
3.然后可以通过拖入或勾选资源 Inspector
窗口上的 Addressable
加入资源。
4.在创建 Group
时, AssetGroups
也会对应的生成 YAML
格式文件,记录资源内容与引导
五、设置远程资源包
1.选择 Group
或对应的 YAML
格式文件,在Inspector窗口可以看到构建路径 Build Path
和 加载路径 Load Path.
2.可以对应修改为 RemoteBuildPath
和 RemoteLoadPath
,可以看到下面对应的地址也发生了改变。
这样构建和加载时就会去到以上对应的地址。
3.远程资源包的地址可以点击 Addressables Groups
> Manager Profiles
或
在 Windows > Asset Management > Addressables > Profiles
按钮
4.打开 Addressables Profiles
窗口进行修改,如下图:
可以先保持不动,下面会先用到这个地址。
六、如何打包
1.我们执行一下 Build / New Build / Default Build Script
,打出 Addressable
资源包,点击后等待一会,完成会有Log提示。
2.构建出来的本地资源Bundle会存放 Library
下指定地址内,如下图:
3.构建出来的远程资源工程 根目录下
会存放ServerData下指定地址内,如下图:
4.值得注意:
是本地资源是会随着APK打包在包体内的。
而远程资源则不会被打包进去 ,需要放到指定位置去加载。
七、加载方式
7-1. Mono脚本指定和实例化:
Mono
脚本 public AssetReference
指定和实例化:
如果我们声明的不是 AssetReference
类型,而是 GameObject
类型,那么场景就直接依赖了预设,这个预设会被打到场景中,但我们这里用的是 AssetReference
,场景并不会真的依赖Sphere预设,它是一个弱引用。
public AssetReference spherePrefabRef;
void Start()
{
spherePrefabRef.LoadAssetAsync<GameObject>().Completed += (obj) =>
{
// 预设
GameObject spherePrefab = obj.Result;
// 实例化
GameObject sphereObj = Instantiate(spherePrefab);
};
}
7-2. 直接实例化指定物体
AssetReference
直接实例化指定物体:
同样, AssetReference
也提供了 InstantiateAsync
方法,方便一步到位进行实例化:
spherePrefabRef.InstantiateAsync().Completed += (obj) =>
{
// 已实例化的物体
GameObject sphereObj = obj.Result;
};
7-3.异步回调加载
例子 Addressables.LoadAssetAsync
,监听 Completed
回调,在回调中拿到资源然后进行操作:
我们加载资源的时间不需要知道资源在哪个 Group
中,也不需要知道资源在哪。只需要知道 Addressable Name
。
以此为加载依据即可,比如:
如图资源名字:Map1Bulid
Addressables.LoadAssetAsync<GameObject>("Map1Bulid").Completed += (handle) =>
{
// 预设物体
GameObject prefabObj = handle.Result;
// 实例化
GameObject cubeObj = Instantiate(prefabObj);
};
7-4.异步直接实例化
Addressables
还提供了 InstantiateAsync
接口,方便直接一步到位实例化,示例:
Addressables.InstantiateAsync("Map1Bulid").Completed += (handle) =>
{
// 已实例化的物体
GameObject cubeObj = handle.Result;
};
7-5.使用 async 、await的方式
使用 async
、 await
的方式,示例:
private async void InstantiateCube()
{
// 虽然这里使用了Task,但并没有使用多线程
GameObject prefabObj = await Addressables.LoadAssetAsync<GameObject>("Map1Bulid").Task;
// 实例化
GameObject cubeObj = Instantiate(prefabObj);
// 也可直接使用InstantiateAsync方法
// GameObject cubeObj = await Addressables.InstantiateAsync("Map1Bulid").Task;
}
7-6.加载场景
使用 Addressables.LoadSceneAsync
加载场景
StartCoroutine(LoadScene());
private IEnumerator LoadScene()
{
var sceneHandle = Addressables.LoadSceneAsync("NewScene");
if (sceneHandle.Status == AsyncOperationStatus.Failed)
{
Debug.LogError("场景加载异常:" + sceneHandle.OperationException.ToString());
}
while (!sceneHandle.IsDone)
{
//监控进度0~1
float progress = sceneHandle.PercentComplete;
Debug.Log("加载进度:" + progress);
yield return null;
}
Debug.Log("加载完毕:");
}
八、加载环境模拟
Addressables资源加载模式有三个,如下,默认情况下是Use Asset Database (fastest)
1. Use Asset Database (fastest)
可以直接从AssetDatabase加载资源,避免打包过程,因此加载速度很快。但是这种方式获取的Profiler信息较少,因为Addressables系统不需要打包资源,所以不会产生AssetBundle的缓存信息。因此,在项目开发阶段,建议使用这种非打包方式,以快速加载资源。
2. Simulate Groups (advanced)
这种模式下,是通过模拟AssetBundle的操作,以获取与打包方式类似的Profiler信息。但不同于直接从AssetDatabase加载资源,其会模拟出AssetBundle的缓存信息,然后通过分析这些信息来获取Profiler数据。因为不需要打包Addressable资源包,所以也无需执行Build操作。因此,这种模式既快又能够获取丰富的Profiler信息,是一个很好的开发调试方式。
3. Use Exising Build(requires built groups)
在这种模式下,仍然需要执行Build操作,将资源打包为Addressable资源包。在运行时,Addressables系统会根据Load Path去加载实际的AssetBundle文件并读取资源。与前面两种模式不同的是,这个模式需要打包资源,所以需要先执行Build操作。如果不先Build,运行时会无法加载资源,导致程序报错。因此,这种模式适用于项目发布或上线前的阶段,以确保资源能够被正确加载。
九、查看引用分析面板
1.点击菜单 Project > AddressableAssetsData > AddressableAssetSettings
2.在 Inspector
窗口中找到 Send Profiler Events
并勾选(不同版本位置不一样)
3.然后点击 Windows > Asset Management > Addressables > Event Viewer
4.打开 **Addressables Event Viewer
**窗口,即可看到资源使用情况,引用次数等信息。
在分析器中可以看到我们实例化出来的预设所依赖的资源,还可以看到引用计数等信息,虽然我们没有打出AssetBundle包,
但却模拟了类似从AssetBundle包中加载资源的效果,这样可以方便我们快速分析加载策略,
十、Hosting Service 本地服务器
这个功能可用于在本地环境模拟加载远端服务器资源(win11系统的慎用,不稳定)
点击菜单 Window / Asset Management / Addressables / Hosting
,接着点击 Create / Local Hosting
,创建一个本地Web服务器,
然后勾选 Enable
这样我们就开启了一个本地的服务器了,IP地址是我本机的局域网IP,我可以通过localhost进行访问,注意这里的端口号是55716。
我们可以看到,它对我们上文中提到的两个文件夹目录进行了 Hosting
,
十一、查看重复资源
1.使用此功能查看重复引用的资源,在AddressablesGroup中选择 Tools > Window > Analyze
打开 **Addressables Analyze
**窗口
2.如下图操作
3.经过一段时间的等待,即可查看在不同包间重复引用的资源,从而方便我们调整分配打包
十一、WebGL平台问题
1.外部包用时编辑器无法正确读取webgl资源
2.将资源组下 Use Asset Bundle Cache
勾选去掉
3.在编辑器下还是会看不到,发布出webGl就好了。
十二、Unity版本选择
1.用官方推荐的几个版本不然容易出些奇怪的问题
十三、资源释放
1.下面是资源加载后对应的释放方式 Addressables.LoadAssetAsync
加载的,配套用 Addressables.Release
进行卸载
例子:
//获取资源与实例化
Addressables.LoadAssetAsync<GameObject>("ModelHero0").Completed += (res) =>{
ThisObj = res.Result;
GameObject sphereObj = Instantiate(ThisObj);
};
//销毁和释放资源
GameObject.Destroy(ThisObj);
Addressables.Release(ThisObj);
下面以以看到加载时开时有引用计数,销毁会清除
2.场景场景加载使用 Addressables.LoadSceneAsync
卸载使用 Addressables.UnloadSceneAsync
3.使用 Addressables.InstantiateAsync
实例化的可以使用,配套的 Addressables.ReleaseInstance
可直接卸载并清除引用
举例:
//加载并实例化
Addressables.InstantiateAsync("ModelHero0").Completed += (obj) =>
{
ThisObj = obj.Result;
};
//卸载并清除引用
Addressables.ReleaseInstance(ThisObj);