Addressable
Resources
- 简单便捷,适合小Demo。
- 一旦运行全部进内存,无法管理。
- 影响游戏的启动时间。
AssetBundle
- Unity中的资源管理底层都是这个,包括Resources。
- 自由度最高,但是要自己写资源管理器,处理依赖关系,自行决定加载时机、卸载时机。
Addressable
- 复杂度在Resources和AssetBundle之间,底层也是AssetBundle
- 运行时会自行处理资源依赖关系、加载、卸载时机。
Addressable界面,分组Build后存储在Library下指定位置(两个预制体+材质)。
发布后同样存在指定位置(文件内容与Build一样)。
分包策略
归属于某个对象(关卡、玩家)的资源打一个包,通用资源单独打包。
两个关卡中都要用到Ground预制体(使用的额外的材质,否则系统内置材质不会单独打包),直接Build分析后会发现材质资源打包重复(即使是内部资源)。
对材质进行单独打包可以看到原来重复的red.mat消失(注意材质文件作为资源才需要单独打包,而不是Ground,Plane类型本身在Unity内置的资源中)。
EventListener工具可以监听资源的加载过程,勾选发送事件选项。
代码调用AA资源
使用Addressable Name(跟Group Name无关)调用资源。
void Start()
{
//异步加载
Addressables.LoadAssetAsync<GameObject>("LV1").Completed += OnLoadLV;
//同步加载
GameObject go = Addressables.LoadAssetAsync<GameObject>("LV1").WaitForCompletion();
Debug.Log(go);
Instantiate(go);
//异步加载多个物体-label
Addressables.LoadAssetsAsync<GameObject>("LV",OnLoad);
//同步方式-label
List<GameObject> golist = Addressables.LoadAssetsAsync<GameObject>("LV", OnLoad).WaitForCompletion() as List<GameObject>;
for (int i = 0; i < golist.Count; i++)
{
Instantiate(golist[i]);
Debug.Log(golist[i].name);
}
}
void OnLoadLV(AsyncOperationHandle<GameObject> temp)
{
GameObject go = temp.Result;
}
void OnLoad(GameObject temp)
{
}
异步加载由于不知道资源什么时候完成不能直接调用,封一个方法给Complete委托,在资源加载完成时将加载的结果赋给go,和程序框架中异步加载回调事件callBack?.Invoke(XXXX)一样,将加载完的资源拿来用。(异步需要资源支持,同步多一些)
同步加载需要等资源加载完再执行下面的逻辑。
可以使用Label来同时加载多个物体。
使用Addressable加载完资源后按需实例化即可,资源加载过程显示如下。