using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.Experimental.GlobalIllumination;
public class ABManager : MonoBehaviour
{
public static ABManager Instace;
private void Awake()
{
Instace = this;
}
//ab包管理器目的是
//让外部更方便进行资源加载
//ab包不能重复加载 用字典存储已加载的ab包
private Dictionary<string, AssetBundle> abDic = new Dictionary<string, AssetBundle>();
//主包
private AssetBundle mainAB = null;
//依赖包
private AssetBundleManifest mainfest = null;
//ab包存放路径方便修改
private string PathUrl
{
get { return Application.streamingAssetsPath + "/"; }
}
private string MainABName
{
get
{
return "ABTest";
}
}
/// <summary>
/// 加载ab包
/// </summary>
/// <param name="abName"></param>
private void LoadAB(string abName)
{
//加载AB包
if (mainAB == null)
{
mainAB = AssetBundle.LoadFromFile(PathUrl + MainABName);
mainfest = mainAB.LoadAsset<AssetBundleManifest>("AssetBundleManifest");
}
AssetBundle ab = null;
//获取依赖包的相关信息
string[] strs = mainfest.GetAllDependencies(abName);
for (int i = 0; i < strs.Length; i++)
{
if (!abDic.ContainsKey(strs[i]))
{
ab = AssetBundle.LoadFromFile(PathUrl + strs[i]);
abDic.Add(strs[i], ab);
}
}
//加载主包来获取资源
if (!abDic.ContainsKey(abName))
{
ab = AssetBundle.LoadFromFile(PathUrl + abName);
abDic.Add(abName, ab);
}
}
/// <summary>
/// 同步加载
/// </summary>
/// <param name="abName"></param>
/// <param name="resName"></param>
/// <returns></returns>
public Object LoadRes(string abName, string resName)
{
LoadAB(abName);
//加载资源
//为了方便 判断是不是gameobject 则直接返回gameobject
Object obj= abDic[abName].LoadAsset(resName);
if (obj is GameObject)
return Instantiate(obj);
else
return obj;
}
/// <summary>
/// 同步加载 根据type指定类型 XLua会用到
/// </summary>
/// <param name="abName"></param>
/// <param name="resName"></param>
/// <param name="type"></param>
/// <returns></returns>
public Object LoadRes(string abName, string resName,System.Type type)
{
LoadAB(abName);
//加载资源
//为了方便 判断是不是gameobject 则直接返回gameobject
Object obj= abDic[abName].LoadAsset(resName,type);
if (obj is GameObject)
return Instantiate(obj);
else
return obj;
}
/// <summary>
/// 根据泛型指定类型 加载资源
/// </summary>
/// <param name="abName"></param>
/// <param name="resName"></param>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public T LoadRes<T>(string abName, string resName) where T:Object
{
LoadAB(abName);
//加载资源
//为了方便 判断是不是gameobject 则直接返回gameobject
T obj= abDic[abName].LoadAsset<T>(resName);
if (obj is GameObject)
return Instantiate(obj);
else
return obj;
}
/// <summary>
/// 通过标签异步加载ab包资源
/// </summary>
/// <param name="abName"></param>
/// <param name="resName"></param>
/// <param name="type"></param>
/// <param name="callBack"></param>
public void LoadResAsync(string abName, string resName, System.Type type,UnityAction<object> callBack)
{
StartCoroutine(ReallyLoadResAsyns(abName, resName,type, callBack));
}
/// <summary>
/// 通过 泛型 异步加载ab包资源
/// </summary>
/// <param name="abName"></param>
/// <param name="resName"></param>
/// <param name="type"></param>
/// <param name="callBack"></param>
public void LoadResAsync<T>(string abName, string resName,UnityAction<object> callBack)
{
StartCoroutine(ReallyLoadResAsyns<T>(abName, resName, callBack));
}
private IEnumerator ReallyLoadResAsyns<T>(string abName, string resName, UnityAction<object> callBack)
{
LoadAB(abName);
//加载资源
//为了方便 判断是不是gameobject 则直接返回gameobject
AssetBundleRequest abr= abDic[abName].LoadAssetAsync(resName);
yield return abr;
if (abr is GameObject)
callBack(Instantiate(abr.asset));
else
callBack(abr.asset);
}
private IEnumerator ReallyLoadResAsyns(string abName, string resName, System.Type type, UnityAction<object> callBack)
{
LoadAB(abName);
//加载资源
//为了方便 判断是不是gameobject 则直接返回gameobject
AssetBundleRequest abr= abDic[abName].LoadAssetAsync(resName,type);
yield return abr;
if (abr is GameObject)
callBack(Instantiate(abr.asset));
else
callBack(abr.asset);
}
//单个包卸载
public void UnLoad(string abName)
{
if (abDic.ContainsKey(abName))
{
abDic[abName].Unload(false);
abDic.Remove(abName);
}
}
//所有包的卸载
public void ClearAB()
{
AssetBundle.UnloadAllAssetBundles(false);
abDic.Clear();
mainAB = null;
mainfest = null;
}
}
Unity AB包资源加载
最新推荐文章于 2024-03-27 18:43:50 发布