Unity AssetBundle异步加载使用教程(一学就会)
因为这篇文章是讲异步加载,所以基本的操作设置会一概而过~
第一步导入AssetBundles-Browser
2019版本的在Package Manager里面就可以搜到,高版本的需要单独下载后吧文件夹导入Packages下面,一定要放Packages这里
第二步设置AB包
插件导入后可以在Window工具栏里找到AssetBundle Browser,点击打开
可能有人在给预制体设置AB包的时候出现下面这个情况
这个问题的解决方式就是把文件夹或者预制体拖到AssetBundle Browser的工具面板中就可以了
异步加载AssetBundle
该脚本为继承MonoBehaviour的单例需要挂在场景中且不能被销毁
//AB包缓存
private Dictionary<string, AssetBundle> abData;
//主包
private AssetBundle mainAB = null;
//依赖包
private AssetBundleManifest relyOnAB = null;
//路径
private string url { get; set; }
//主包名称
private string mainABname { get; set;}
//调试查看 Text
public Text textProgress;
//相当于Awake方法
protected override void initial()
{
base.initial();
abData= new Dictionary<string, AssetBundle>();
Debug.Log("进入这个方法");
}
public void LoadAB(string[] list,Action action)
{
StartCoroutine(LoadABPrefabs(list,action));
}
//异步
public IEnumerator LoadABPrefabs(string[] abName, Action action 回调方法Action为自定义委托 根据需求可有可无)
{
AssetBundle ab;
//加载ab包
if (mainAB == null)
{
mainAB = AssetBundle.LoadFromFile(url + mainABname );
mainManifest = mainAB.LoadAsset<AssetBundleManifest>("AssetBundleManifest");
}
foreach (var item in abName)
{
string[] relyOnAb_list= mainManifest.GetAllDependencies(item);
//加载所有依赖包
for (int i = 0; i < relyOnAb_list.Length; i++)
{
if (!abData.ContainsKey(relyOnAb_list[i]))
{
//加载
ab = AssetBundle.LoadFromFile(basePath + relyOnAb_list[i]);
abData.Add(relyOnAb_list[i], ab);
}
}
if (!abData.ContainsKey(item))
{
//根据路径下载对应包体
UnityWebRequest requesr = UnityWebRequestAssetBundle.GetAssetBundle(url + item);
requesr.SendWebRequest();
while (!requesr.isDone)
{
textProgress.text = "正在加载\"" + item + "\"资源包:" + (requesr.downloadProgress * 100).ToString("F0") + "%";
yield return 1;
}
if (requesr.isDone)
{
textProgress.text = "正在加载\"" + item + "\"资源包:" + 100 + "%";
}
AssetBundle asset = (requesr.downloadHandler as DownloadHandlerAssetBundle).assetBundle;
if (asset == null)
{
yield break;
}
abData.Add(item, asset);
Debug.Log("加载完成");
Debug.Log(asset.name);
}
else
{
textProgress.text = "正在加载\"" + item + "\"资源包:" + 90 + "%";
yield return new WaitForSeconds(1);
textProgress.text = "正在加载\"" + item + "\"资源包:" + 100 + "%";
}
}
if (action != null)
{
action();
}
}
调用
public string[] Str_data={"resources","scenes","sprite"}
void Start(){
AssetBundlesManager.getSingleton().LoadAB(Str_data,CallBack);
}
void CallBack(){
Debug.Log("全部加载完成");
}
备注
不用异步加载的方式跟异步也差不多,只是不用UnityWebRequest加载了而已
正常的加载就是LoadFromFile()这个方法就Ok;
需要AB包插件和源码的可以私信或者评论