Addressable

Resources

  • 简单便捷,适合小Demo。
  • 一旦运行全部进内存,无法管理。
  • 影响游戏的启动时间。

AssetBundle

  • Unity中的资源管理底层都是这个,包括Resources。
  • 自由度最高,但是要自己写资源管理器,处理依赖关系,自行决定加载时机、卸载时机。

Addressable

  • 复杂度在Resources和AssetBundle之间,底层也是AssetBundle
  • 运行时会自行处理资源依赖关系、加载、卸载时机。

alt

Addressable界面,分组Build后存储在Library下指定位置(两个预制体+材质)。

alt

发布后同样存在指定位置(文件内容与Build一样)。

alt

分包策略

归属于某个对象(关卡、玩家)的资源打一个包,通用资源单独打包。

alt

两个关卡中都要用到Ground预制体(使用的额外的材质,否则系统内置材质不会单独打包),直接Build分析后会发现材质资源打包重复(即使是内部资源)。

alt

对材质进行单独打包可以看到原来重复的red.mat消失(注意材质文件作为资源才需要单独打包,而不是Ground,Plane类型本身在Unity内置的资源中)。

alt

EventListener工具可以监听资源的加载过程,勾选发送事件选项。

alt

代码调用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)一样,将加载完的资源拿来用。(异步需要资源支持,同步多一些)

同步加载需要等资源加载完再执行下面的逻辑。

alt

可以使用Label来同时加载多个物体。

使用Addressable加载完资源后按需实例化即可,资源加载过程显示如下。

alt