今天是2020年的第一天,祝大家新年快乐。
前些时间看到Unity官方推得 可寻址系统Addressable AssetSystem,新的资源管理加载系统。据官方说以后Unity的资源加载模块重心将会放到该系统上,又是一个亲儿子。这几天抽时间看了一下,其原理也是在AB包的基础上进行了一层高级的封装。之前 我们游戏开发过程中,需要自己去根据游戏写一套自己的资源管理加载系统,这一块牵扯到AssetBundle相关的知识,没有一定前端开发经验的,可能写起来比较困难,毕竟牵扯到后期资源的热更新。而新的可寻址系统,则是帮我们写好的一套资源管理加载系统,免去了我们直接对AB包的操作。在尝试使用过后,自我感觉目前还 没有 达到想象中的那么好用。
可寻址,这个地址 默认是文件 在工程中的路径,可修改。通过引用计数 去管理 资源的加载次数,当每次释放该资源的时候 引用计数减减,小于等于0的时候,卸载该资源。更加方便了内存的管理。
Unity在加载资源的时候,先去检查本地有没有资源,没有的话,会去资源服务器地址上加载,缓存到本地。新的可寻址系统,提供了三种打包方式。
第一种模式:资源的打包和加载都是本地,速度很快,开发阶段可以使用该模式。
第二种模式:本地虚拟一个服务器环境,进行加载测试
第三种模式:真正的 将资源放在服务器上进行加载测试
当打包模式切换到 第三种之后,一定要先打包,在运行,不然会报错。路径也要换成远程的
该系统的资源加载都是异步操作的。Unity内除了脚本,其他的均可以被标记为可寻址资源,包括场景,系统会自动加载场景中的物体。
1.AssetReference.InstantiateAsync 异步实例化物体
using UnityEngine;
using UnityEngine.AddressableAssets;
public class Test1 : MonoBehaviour
{
public AssetReference m_ArcherObject;
void Start()
{
m_ArcherObject.InstantiateAsync();
}
}
在面板指定相应的物体
2.LoadAssetAsync 异步资源加载,通过绑定一个回调函数,在资源加载完毕,自动执行回调。
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
public class Test2 : MonoBehaviour
{
void Start()
{
Addressables.LoadAssetAsync<GameObject>("Model1").Completed += OnLoadedComplete;
}
private void OnLoadedComplete(AsyncOperationHandle<GameObject> obj)
{
if (res.Status==AsyncOperationStatus.Succeeded)
{
GameObject ob = obj.Result;
ob= Instantiate(ob);
ob.name = "TestModel1";
}
}
}
3. Addressables.InstantiateAsync 可以直接执行实例化物体
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
public class Test2 : MonoBehaviour
{
void Start()
{
Addressables.InstantiateAsync("Model1").Completed += (a) =>
{
GameObject obj = a.Result;
obj.name = "testModel1";
};
}
4.根据Lable 进行资源的加载,它会将所有带有该标签的 资源 查询放到一个list里面,再去使用加载函数 去加载出来。该接口会去查询资源的地址,返回过来。
using UnityEngine.ResourceManagement.ResourceLocations;
private void Start()
{
Addressables.LoadResourceLocationsAsync("Models").Completed += OnResLoaded;
}
5.多图精灵加载,以前的方法,返回的是一个集合。新的加载方式,可以直接去加载大图中的精灵
Addressables.LoadAssetAsync<IList<Sprite>>("Numbers").Completed += (a) =>
{
Debug.Log(a.Result.Count);
};
Addressables.LoadAssetAsync<Sprite>("Numbers[数字_3]").Completed += (a) =>
{
TestImage.sprite = a.Result;
};
6.资源的热更,可以直接去打 增量包,系统会自动检测出 哪些文件发生了改变,以前 我们可能会去检测资源的Crc,然后去比对前一个版本的资源清单,比对得出发生改变的资源,新的系统 会自动完成,打出增量包,只需要将增量包放到服务器,Unity在加载资源的时候,会自动去加载新的资源。目前觉得有些地方很麻烦,每次打增量包的时候,总会多出新的Asset资源
可寻址系统还加入了资源管理的Profile面板,很方便查看资源的加载情况。
目前感觉在资源的热更上,还需要优化,还是需要我们自己去处理热更的流程更方便。期待官方的后期优化。Unity的每次更新,真的有很大变化,自从2018之后,真的是需要去关注每次版本的更新,了解新的知识。