Unity AssetBundle依赖加载

//加载Bundle的依赖资源清单
    private IEnumerator LoadAssetbundleManifest(Action<bool> action)
    {
        if (_assetBundleManifest != null)
        {
            if (action != null)
                action(true);
        }
        else
        {
    //依赖资源的名字和平台的名字一样加载时直接得到平台名称就可以了
            string path = GameManager.Instance.GetFileFullPath(MiscUtils.GetCurrentPlatform() + "/" + MiscUtils.GetCurrentPlatform());
            WWW www = new WWW(path);
            yield return www;
            if (www.isDone && www.error == null)
            {
                if (_assetBundleManifest != null)
                    _assetBundleManifest = null;


                _assetBundleManifest = (AssetBundleManifest)www.assetBundle.LoadAsset("assetbundlemanifest");
                www.assetBundle.Unload(false);
                if (action != null)
                    action(true);
            }
            else
            {
                if (action != null)
                    action(false);
                UIUtils.LogError("加载列表清单失败");
            }
        }
    }

加载依赖资源和平时使用加载差不多,只是需要记录加载的次数,

   

 /// <summary>
    /// 加载依赖资源
    /// </summary>
    /// <param name="pathName"></param>
    public void LoadDependenciesBundle(string pathName)
    {
        if (_assetBundleManifest == null) {
            if (!bundelManifestName.Contains(pathName))
                bundelManifestName.Add(pathName);
            //Debug.LogError("依赖加载清单是空的");
            return;
        }


        if (bundelManifestName.Contains(pathName))
            bundelManifestName.Remove(pathName);
        string[] manifestName = _assetBundleManifest.GetAllDependencies(pathName);
        for (int i = 0; i < manifestName.Length; ++i)
        {
    //加载的资源列表和已加载好的资源中存在该资源则不再加载该资源
            if (_loadAssetBundle.ContainsKey(manifestName[i]) || GetHaveWWWBundle(manifestName[i]))
            {
                if (_loadAssetBundle.ContainsKey(manifestName[i]))
                    _loadAssetBundle[manifestName[i]].count += 1;
                else
                {
                    AssetBundleData ab = new AssetBundleData();
                    _loadAssetBundle.Add(manifestName[i], new AssetBundleData() { count = 1, });
                }
                continue;
            }
            string manifestPath = GameManager.Instance.GetFileFullPath(MiscUtils.GetCurrentPlatform() + "/" + manifestName[i]);
            //异步加载的bundle
            LoadAssetBundle loadManifestBundle = new LoadAssetBundle();
            loadManifestBundle.www = new WWW(manifestPath);
            loadManifestBundle.path = manifestPath;
            loadManifestBundle.key = manifestName[i];
   //添加到下载列表
            www.Add(loadManifestBundle);
        }
    }

    /// <summary>
    /// 卸载资源
    /// </summary>
    /// <param name="name"></param>
    /// <param name="pathName"></param>
    public void UnLoadAssetBundle(string pathName)
    {
        pathName = pathName.ToLower();
        //卸载资源
        if (_loadAssetBundle.ContainsKey(pathName))
        {//
            //Debug.LogError("卸载的依赖资源:" + pathName);
            _loadAssetBundle[pathName].count -= 1;
            if (_loadAssetBundle[pathName].count <= 0)
            {
                _loadAssetBundle[pathName].assetBundle.Unload(true);
                _loadAssetBundle.Remove(pathName);
            }
        }
    }

有时候游戏中需要动态更新资源,下载好之后要及时更新资源,如果加载了正在更新的资源需要Unload,(Unload(true)这里不能使用,IOS下会可能崩掉)
   

    /// <summary>
    /// 检测更新资源包
    /// </summary>
    /// <param name="pathName"></param>
    /// <returns></returns>
    public bool CheckLoadAssetBundle(string pathName)
    {
        if (_loadAssetBundle == null)
            return false;
        pathName = pathName.ToLower();
        //卸载资源
        foreach (string key in _loadAssetBundle.Keys)
        {
            if (pathName.Contains(key))
            {
                UIUtils.LogError("检测更新资源包:" + key + "***********" + pathName);
                _loadAssetBundle[key].assetBundle.Unload(false);
                _loadAssetBundle.Remove(key);
                return true;
            }
        }
        return false;
    }

    //更新Bundle
    private void UpdateBundle()
    {
        if (www != null)
        {
            //异步加载资源
            for (int i = 0; i < www.Count; ++i)
            {
                if (www[i].www.error != null)
                {
                    UIUtils.LogError("www加载资源错误" + www[i].key);
                    www.Remove(www[i]);
                }
                else if (www[i].www.isDone)
                {
                    //Debug.LogError("www加载资源:" + www[i].key);
                    if (!_loadAssetBundle.ContainsKey(www[i].key))
                    {
                        _loadAssetBundle[www[i].key] = new AssetBundleData() { assetBundle = www[i].www.assetBundle, count = 1};
                    }
                    else
                    {
                        if (_loadAssetBundle[www[i].key].assetBundle == null)
                            _loadAssetBundle[www[i].key].assetBundle = www[i].www.assetBundle;
                        _loadAssetBundle[www[i].key].count += 1;
                    }
                    www.Remove(www[i]);
                }
                //else
                //    ++i;
            }
            //有未加载资源
        }
        if (bundelManifestName != null && _assetBundleManifest != null)
        {
            while(bundelManifestName.Count > 0)
                LoadDependenciesBundle(bundelManifestName[0]);
        }
    }

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值