AssetBundle框架主流程之MultiABMgr

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MultiABMgr 
{


    private SingleABLoader _CurrentSingleABLoader;

    private Dictionary<string, SingleABLoader> _DicSingleABLoaderCache;

    //当前Assetbundle 名称
    private string _CurrentABName;
    //AB包与对应依赖和引用关系集合
    private Dictionary<string, ABRelation> _DicABRelation;

    //当前模块(调试使用)
    private string _CurrentModelName;

    public MultiABMgr(string abname, string modlename)
    {
        _CurrentABName = abname;
        _CurrentSingleABLoader = new SingleABLoader(abname);
        _DicSingleABLoaderCache = new Dictionary<string, SingleABLoader>();
        _DicABRelation = new Dictionary<string, ABRelation>();
        _CurrentModelName = modlename;
    }

    /// <summary>
    /// 加载AB包  递归加载
    /// </summary>
    public void LoadAssetBundle(string abname)
    {
        Debug.Log("AB--" + abname);
        if (!_DicABRelation.ContainsKey(abname))
        {
            ABRelation aBRelation = new ABRelation(abname);
            _DicABRelation.Add(abname, aBRelation);
           
        }
        ABRelation tmpaBRelationObj = _DicABRelation[abname];

        //得到指定AB包的所有依赖和引用关系(查询Manifest清单文件)
        string[] strDependenceArray = ABManifestLoader.GetInstance().GetAllDepences(abname);

        foreach (var item in strDependenceArray)
        {
            //添加依赖
            tmpaBRelationObj.AddDependence(item);


            //添加引用
            if (!_DicABRelation.ContainsKey(item))
            {
                ABRelation aBRelation = new ABRelation(item);
                aBRelation.AddReference(abname);
                _DicABRelation.Add(item, aBRelation);

                ABRelation tmpABRelationObj = _DicABRelation[item];

                //先加载依赖AB包
                LoadAssetBundle(item);
            }
            else  //AB包已经加载
            {
                ABRelation aBRelation = _DicABRelation[abname];
                //添加AB包引用关系(被依赖)
                aBRelation.AddReference(abname);
            }
           
        }

      
        //真正加载AB包
        if (_DicSingleABLoaderCache.ContainsKey(abname))
        {
            return; //AB包已经加载
        }
        else
        {
          
            _CurrentSingleABLoader = new SingleABLoader(abname);
            _DicSingleABLoaderCache.Add(abname, _CurrentSingleABLoader);
            _DicSingleABLoaderCache[abname].LoadAssetBundle();
        }
    }

    /// <summary>
    /// 
    /// </summary>
    /// <param name="abName"></param>
    /// <param name="assetName"></param>
    /// <param name="isCache"></param>
    /// <returns></returns>
    public UnityEngine.Object LoadAsset(string abName, string assetName, bool isCache = false)
    {
        foreach (var item_abname in _DicSingleABLoaderCache.Keys)
        {
            Debug.Log(item_abname);
            if (abName == item_abname)
            {
               
                return _DicSingleABLoaderCache[item_abname].LoadAsset(assetName, isCache);
            }
        }
        Debug.Log("加载资源" + _DicSingleABLoaderCache.Count);

        Debug.LogError(GetType() + "/LoadAsset()/找不到Assetbundle包,无法加载资源,请检查abname=" + abName + ",assetName=" + assetName);
        return null;
    }



    /// <summary>
    /// 释放所有的资源
    /// </summary>
    public void DisposeAllAsset()
    {
        try
        {
            //逐一释放所有加载过的Asset Bundle 包中的资源
            foreach (SingleABLoader item in _DicSingleABLoaderCache.Values)
            {
                item.DisposeAll();
            }
        }
        finally
        {
            _DicSingleABLoaderCache.Clear();
            _DicSingleABLoaderCache = null;

            //释放其他对象资源
            _DicABRelation.Clear();
            _DicABRelation = null;
            _CurrentABName = null;
            _CurrentModelName = null;

            //卸载未使用到的资源
            Resources.UnloadUnusedAssets();
            //强制垃圾收集
            System.GC.Collect();
        }
    }

}

--若是对您有所帮助,世界便多了一份你我的温暖
--您的支持将是我的动力,手有余粮的话,一点点赞赏我将开心不已(一毛钱也是极好的)

猜你喜欢

转载自blog.csdn.net/weixin_41995872/article/details/105458367