Unity AB包异步加载

因为这篇文章是讲异步加载,所以基本的操作设置会一概而过~

第一步导入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包插件和源码的可以私信或者评论
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值