前言
开发过程中,有可能遇到分辨率很大,数量也很多的序列帧动画需求,在甲方要求高清晰度 ,不能压缩的情况下,正常做成动画直接打包,1.5G的序列帧动画,打出来的包在3.5G左右,加载卡顿严重。在这种情况下,建议使用Addressable System进行处理。
一、导入Addressables System
当前unity版本为2018.2.11,打开Package Manager,在all中选择Addressables System,并Install,安装好之后可以在Window --> Asset Management --> Addressable Assets中打开Addressables窗口。
二、标记资源
1.拖入动画到自定义的目录下
2.资源编译打包
三、引用资源
选择要引用的controller,勾选Addressable,后边的地址就可以复制了,复制地址在代码中使用。
代码如下(示例):
public Animator animator;
void Start () {
Addressables.LoadAsset<RuntimeAnimatorController>("Assets/背景的_00000.controller").Completed += OnLoadDone;
}
private void OnLoadDone(IAsyncOperation<RuntimeAnimatorController> data)
{
animator.runtimeAnimatorController = data.Result;
animator.enabled = true;
}
总结
按照这样的方法,一是资源无需重复编译,打包的时间大幅度缩小,二是加载时是先加载场景,再读取资源,可在界面添加加载资源提示,不会出现卡顿很久无法进入的情况。
补充
在后边项目的实际使用当中发现了一些问题,一块总结到下边。
1、实际打包中,只在一个 Group 中打包这些序列帧资源的话,超过一定量级依然出现资源加载异常,序列帧闪烁的情况
解决:将资源分配在多个Group中进行打包。
2、上边文章中介绍的插件运行环境是2018.2.11的0.5.3版本,在2019.4.39版本中,我使用的是1.18.19版本的Addressables,上边提及的LoadAsset方法已经过时了,转而使用LoadAssetsAsync,但是不影响整体效果。而且新版也不会将资源自动编译放入 StreamingAssets文件夹中了,而是在Library\com.unity.addressables文件夹下,但是出包后依然在StreamingAssets中。
public AssetLabelReference assetLabel;
void Start()
{
Addressables.LoadAssetsAsync<RuntimeAnimatorController>(assetLabel, OnLoadDone);
}
/// <summary>
/// 资源加载完成回调,此处可以加一个进度显示和交互限制,等待加载完毕之后再操作,防止异常
/// </summary>
/// <param name="animtorClip"></param>
void OnLoadDone(RuntimeAnimatorController animtorClip)
{
Debug.Log(animtorClip.name);
}
3、项目序列帧资源为240M,实测正常流程制作Animation打包大小为5.59G,使用Addressables后包体大小为388M(在对比过程中还有一个小发现,使用2019打包巨多序列帧的程序,实际运行时占用的内存空间是很小的,而2018中则需要申请巨大的空间,有了解其中原因的可以科普一下)。
2019出的包:
2018出的包: