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