/// <summary>
        /// 卸载资源
        /// </summary>
        /// <param name="_hasName"></param>
        private void UnloadAssetBundleAsync(string _hasName)
        {
            AssetBundleObject abObj = null;

            if (_loadedABList.ContainsKey(_hasName))
            {
                abObj = _loadedABList[_hasName];
            }
            else if (_loadingABList.ContainsKey(_hasName))
            {
                abObj = _loadingABList[_hasName];
            }
            else if (_readyABList.ContainsKey(_hasName))
            {
                abObj = _readyABList[_hasName];
            }

            if (abObj == null)
            {
                Debug.LogError("Unload Asset" + _hasName + "Fail");
            }
            else
            {
                abObj.refCount--;
                foreach (var dpObj in abObj.depends)
                {
                    UnloadAssetBundleAsync(dpObj.name);
                }

                if (abObj.refCount == 0)
                {
                    _unloadABList.Add(_hasName, abObj);
                }
            }
        }
示例#2
0
    private void DoLoad(AssetBundleObject abObj)
    {
        //if (AssetsDownloadMgr.I.IsNeedDownload(GetFileName(abObj._hashName)))
        //{//这里是关联下载逻辑,可以实现异步下载再异步加载
        //    AssetsDownloadMgr.I.DownloadAsync(GetFileName(abObj._hashName),
        //        () =>
        //        {
        //            string path = GetAssetBundlePath(abObj._hashName);
        //            abObj._request = AssetBundle.LoadFromFileAsync(path);

        //            if (abObj._request == null)
        //            {
        //                string errormsg = string.Format("LoadAssetbundle path error ! assetName:{0}", abObj._hashName);
        //                Debug.LogError(errormsg);
        //            }
        //        }
        //    );
        //}
        //else
        //{
        //    string path = GetAssetBundlePath(abObj._hashName);
        //    abObj._request = AssetBundle.LoadFromFileAsync(path);

        //    if (abObj._request == null)
        //    {
        //        string errormsg = string.Format("LoadAssetbundle path error ! assetName:{0}", abObj._hashName);
        //        Debug.LogError(errormsg);
        //    }
        //}
    }
示例#3
0
    /// <summary>
    ///
    /// </summary>
    /// <param name="bundleName">バンドル名</param>
    /// <param name="path">StreamingAssets/以下のフォルダパス</param>
    public void LoadBundle(string bundleName, string path = "")
    {
        //依存バンドルロード
        var dependencies = _manifest.GetAllDependencies(bundleName);

        foreach (var d in dependencies)
        {
            //bundleObjectListに含まれていたら取得
            var dobj = _bundleObjectList.Find((b) => { return(b.BundleName == d); });
            if (dobj == null)
            {
                //なければnewして生成
                dobj = new AssetBundleObject(d, path);
                _bundleObjectList.Add(dobj);
            }
            StartCoroutine(dobj.LoadBundle());
        }

        //本体バンドルロード
        var obj = _bundleObjectList.Find((b) => { return(b.BundleName == bundleName); });

        if (obj == null)
        {
            obj = new AssetBundleObject(bundleName, path);
            _bundleObjectList.Add(obj);
        }
        StartCoroutine(obj.LoadBundle());
    }
        private void DoLoad(AssetBundleObject abObj)
        {
            string path = GetAssetBundlePath(abObj.name, abObj.bPublic);

            abObj.request = AssetBundle.LoadFromFileAsync(path);
            if (abObj.request == null)
            {
                string errormsg = string.Format("LoadAssetbundle path error ! assetName:{0}", abObj.name);
                Debug.LogError(errormsg);
            }
        }
 private void DoUnload(AssetBundleObject abObj)
 {
     if (abObj.assetbundle != null)
     {
         abObj.assetbundle.Unload(true);
         abObj.assetbundle = null;
     }
     else
     {
         Debug.LogError("LoadAssetbundle DoUnload error !" + abObj.name);
     }
 }
 /// <summary>
 /// 异步加载添加引用计数
 /// </summary>
 /// <param name="abObj"></param>
 private void DoDependsRef(AssetBundleObject abObj)
 {
     abObj.refCount++;
     if (abObj.depends.Count == 0)
     {
         return;
     }
     foreach (var dps in abObj.depends)
     {
         DoDependsRef(dps);
     }
 }
示例#7
0
    private void DoUnload(AssetBundleObject abObj)
    {
        //这里用true,卸载Asset内存,实现指定卸载
        if (abObj._ab == null)
        {
            string errormsg = string.Format("LoadAssetbundle DoUnload error ! assetName:{0}", abObj._hashName);
            Debug.LogError(errormsg);
            return;
        }

        abObj._ab.Unload(true);
        abObj._ab = null;
    }
示例#8
0
    private void DoDependsRef(AssetBundleObject abObj)
    {
        abObj._refCount++;

        if (abObj._depends.Count == 0)
        {
            return;
        }
        foreach (var dpObj in abObj._depends)
        {
            DoDependsRef(dpObj); //递归依赖项,加载完
        }
    }
示例#9
0
    private void UnloadAssetBundleAsync(string _hashName)
    {
        AssetBundleObject abObj = null;

        if (_loadedABList.ContainsKey(_hashName))
        {
            abObj = _loadedABList[_hashName];
        }
        else if (_loadingABList.ContainsKey(_hashName))
        {
            abObj = _loadingABList[_hashName];
        }
        else if (_readyABList.ContainsKey(_hashName))
        {
            abObj = _readyABList[_hashName];
        }

        if (abObj == null)
        {
            string errormsg = string.Format("UnLoadAssetbundle error ! assetName:{0}", _hashName);
            Debug.LogError(errormsg);
            return;
        }

        if (abObj._refCount == 0)
        {
            string errormsg = string.Format("UnLoadAssetbundle refCount error ! assetName:{0}", _hashName);
            Debug.LogError(errormsg);
            return;
        }

        abObj._refCount--;

        foreach (var dpObj in abObj._depends)
        {
            UnloadAssetBundleAsync(dpObj._hashName);
        }

        if (abObj._refCount == 0)
        {
            _unloadABList.Add(abObj._hashName, abObj);
        }
    }
        private void DoLoadedCallFun(AssetBundleObject abObj, bool bAsync = true)
        {
            if (abObj.request != null)
            {
                abObj.assetbundle = abObj.request.assetBundle;
                abObj.request     = null;
                _loadingABList.Remove(abObj.name);
                _loadedABList.Add(abObj.name, abObj);
            }

            if (abObj.assetbundle == null)
            {
                ///这里可以添加下载
                ///如果游戏太大,可以等玩家先下载游戏之后,剩余的资源等用到再下载
            }

            foreach (var callback in abObj._callbacks)
            {
                callback(abObj.assetbundle);
            }

            abObj._callbacks.Clear();
        }
        /// <summary>
        /// 异步加载
        /// </summary>
        /// <param name="_hasName"></param>
        /// <param name="callback"></param>
        /// <returns></returns>
        private AssetBundleObject LoadAssetBundleAsync(string _hasName, AssetBundleLoadCallback callback,
                                                       bool bPublic = false)
        {
            AssetBundleObject abObj = null;

            if (_loadedABList.ContainsKey(_hasName)) //已经加载
            {
                abObj = _loadedABList[_hasName];
                DoDependsRef(abObj);
                callback(abObj.assetbundle);

                return(abObj);
            }
            else if (_loadingABList.ContainsKey(_hasName)) //正在加载
            {
                abObj = _loadingABList[_hasName];
                DoDependsRef(abObj);
                abObj._callbacks.Add(callback);
                return(abObj);
            }
            else if (_readyABList.ContainsKey(_hasName))
            {
                abObj = _readyABList[_hasName];
                DoDependsRef(abObj);
                abObj._callbacks.Add(callback);
                return(abObj);
            }

            abObj          = new AssetBundleObject();
            abObj.name     = _hasName;
            abObj.bPublic  = bPublic;
            abObj.refCount = 1;
            abObj._callbacks.Add(callback);
            ///先加载依赖项
            ///这里设置一个约定
            ///公共资源的依赖项必须放在公共资源文件夹中
            ///即不能放在CNS,EN等文件夹中
            string[] dependsData = null;

            if (_dependsDataList.ContainsKey(_hasName))
            {
                Debug.Log("加载物体的名字" + _hasName);
                dependsData = _dependsDataList[_hasName];
                foreach (string name in dependsData)
                {
                    Debug.Log(name);
                }
            }

            if (dependsData != null && dependsData.Length > 0)
            {
                abObj._dependLoadingCount = dependsData.Length;
                //依赖依次加载
                foreach (var dpName in dependsData)
                {
                    AssetBundleObject dpObj = LoadAssetBundleAsync(dpName,
                                                                   (ab) =>
                    {
                        if (abObj._dependLoadingCount <= 0)
                        {
                            Debug.LogError("LoadAssetBundle: " + _hasName + " depends error");
                        }
                        else
                        {
                            abObj._dependLoadingCount--;
                            //依赖加载完成,回调
                            if (abObj._dependLoadingCount == 0 && abObj.request != null && abObj.request.isDone)
                            {
                                DoLoadedCallFun(abObj);
                            }
                        }
                    }, bPublic);
                    abObj.depends.Add(dpObj);
                }
            }

            if (_loadingABList.Count < MAX_LOADING_NUM)
            {
                DoLoad(abObj);
                _loadingABList.Add(_hasName, abObj);
            }
            else
            {
                _readyABList.Add(_hasName, abObj);
            }

            return(abObj);
        }
        /// <summary>
        /// 同步加载
        /// </summary>
        /// <param name="_hasName"></param>
        /// <returns></returns>
        private AssetBundleObject LoadAssetBundleSync(string _hasName, bool bPublic = false)
        {
            AssetBundleObject abObj = null;

            if (_loadedABList.ContainsKey(_hasName)) //已经加载了
            {
                abObj = _loadedABList[_hasName];
                abObj.refCount++;

                foreach (var dpObj in abObj.depends)
                {
                    LoadAssetBundleSync(dpObj.name);
                }

                return(abObj);
            }
            else if (_loadingABList.ContainsKey(_hasName)) //正在加载中
            {
                abObj = _loadingABList[_hasName];
                abObj.refCount++;
                foreach (var dpObj in abObj.depends)
                {
                    LoadAssetBundleSync(dpObj.name);
                }

                DoLoadedCallFun(abObj, false);
                return(abObj);
            }
            else if (_readyABList.ContainsKey(_hasName)) //在准备加载中
            {
                abObj = _readyABList[_hasName];
                abObj.refCount++;
                foreach (var dpObj in abObj.depends)
                {
                    LoadAssetBundleSync(dpObj.name);
                }

                string abPath = GetAssetBundlePath(_hasName, bPublic);
                abObj.assetbundle = AssetBundle.LoadFromFile(abPath);
                _readyABList.Remove(abObj.name);
                _loadedABList.Add(abObj.name, abObj);

                DoLoadedCallFun(abObj, false);

                return(abObj);
            }

            abObj          = new AssetBundleObject();
            abObj.name     = _hasName;
            abObj.bPublic  = bPublic;
            abObj.refCount = 1;
            string path = GetAssetBundlePath(_hasName, bPublic);

            abObj.assetbundle = AssetBundle.LoadFromFile(path);

            if (abObj.assetbundle == null)
            {
                Debug.LogError(path + "不存在");
                return(null);
            }

            string[] dependData = null;
            if (_dependsDataList.ContainsKey(_hasName))
            {
                dependData = _dependsDataList[_hasName];
            }

            if (dependData != null && dependData.Length > 0)
            {
                abObj._dependLoadingCount = 0;
                foreach (var dpAssetName in dependData)
                {
                    var dpObj = LoadAssetBundleSync(dpAssetName);
                    abObj.depends.Add(dpObj);
                }
            }

            _loadedABList.Add(abObj.name, abObj);

            return(abObj);
        }
示例#13
0
    private void DoLoadedCallFun(AssetBundleObject abObj, bool isAsync = true)
    {
        //提取ab
        if (abObj._request != null)
        {
            abObj._ab      = abObj._request.assetBundle; //如果没加载完,会异步转同步
            abObj._request = null;
            _loadingABList.Remove(abObj._hashName);
            _loadedABList.Add(abObj._hashName, abObj);
        }

        if (abObj._ab == null)
        {
            string errormsg = string.Format("LoadAssetbundle _ab null error ! assetName:{0}", abObj._hashName);
            string path     = GetAssetBundlePath(abObj._hashName);
            errormsg += "\n File " + File.Exists(path) + " Exists " + path;

            try
            {//尝试读取二进制解决
                if (File.Exists(path))
                {
                    byte[] bytes = File.ReadAllBytes(path);
                    if (bytes != null && bytes.Length != 0)
                    {
                        abObj._ab = AssetBundle.LoadFromMemory(bytes);
                    }
                }
            }
            catch (Exception ex)
            {
                Debug.LogError("LoadAssetbundle ReadAllBytes Error " + ex.Message);
            }

            if (abObj._ab == null)
            {
                //同步下载解决
                //byte[] bytes = AssetsDownloadMgr.I.DownloadSync(GetFileName(abObj._hashName));
                byte[] bytes = new byte[4];
                if (bytes != null && bytes.Length != 0)
                {
                    abObj._ab = AssetBundle.LoadFromMemory(bytes);
                }

                if (abObj._ab == null)
                {//同步下载还不能解决,移除
                    if (_loadedABList.ContainsKey(abObj._hashName))
                    {
                        _loadedABList.Remove(abObj._hashName);
                    }
                    else if (_loadingABList.ContainsKey(abObj._hashName))
                    {
                        _loadingABList.Remove(abObj._hashName);
                    }

                    Debug.LogError(errormsg);

                    if (isAsync)
                    {//异步下载解决
                     //AssetsDownloadMgr.I.AddDownloadSetFlag(GetFileName(abObj._hashName));
                    }
                }
            }
        }

        //运行回调
        foreach (var callback in abObj._callFunList)
        {
            callback(abObj._ab);
        }
        abObj._callFunList.Clear();
    }
示例#14
0
    private AssetBundleObject LoadAssetBundleAsync(string _hashName, AssetBundleLoadCallBack _callFun)
    {
        AssetBundleObject abObj = null;

        if (_loadedABList.ContainsKey(_hashName)) //已经加载
        {
            abObj = _loadedABList[_hashName];
            DoDependsRef(abObj);
            _callFun(abObj._ab);
            return(abObj);
        }
        else if (_loadingABList.ContainsKey(_hashName)) //在加载中
        {
            abObj = _loadingABList[_hashName];
            DoDependsRef(abObj);
            abObj._callFunList.Add(_callFun);
            return(abObj);
        }
        else if (_readyABList.ContainsKey(_hashName)) //在准备加载中
        {
            abObj = _readyABList[_hashName];
            DoDependsRef(abObj);
            abObj._callFunList.Add(_callFun);
            return(abObj);
        }

        //创建一个加载
        abObj           = new AssetBundleObject();
        abObj._hashName = _hashName;

        abObj._refCount = 1;
        abObj._callFunList.Add(_callFun);

        //加载依赖项
        string[] dependsData = null;
        if (_dependsDataList.ContainsKey(_hashName))
        {
            dependsData = _dependsDataList[_hashName];
        }

        if (dependsData != null && dependsData.Length > 0)
        {
            abObj._dependLoadingCount = dependsData.Length;

            foreach (var dpAssetName in dependsData)
            {
                var dpObj = LoadAssetBundleAsync(dpAssetName,
                                                 (AssetBundle _ab) =>
                {
                    if (abObj._dependLoadingCount <= 0)
                    {
                        string errormsg = string.Format("LoadAssetbundle depend error ! assetName:{0}", _hashName);
                        Debug.LogError(errormsg);
                        return;
                    }

                    abObj._dependLoadingCount--;

                    //依赖加载完
                    if (abObj._dependLoadingCount == 0 && abObj._request != null && abObj._request.isDone)
                    {
                        DoLoadedCallFun(abObj);
                    }
                }
                                                 );

                abObj._depends.Add(dpObj);
            }
        }

        if (_loadingABList.Count < MAX_LOADING_COUNT) //正在加载的数量不能超过上限
        {
            DoLoad(abObj);

            _loadingABList.Add(_hashName, abObj);
        }
        else
        {
            _readyABList.Add(_hashName, abObj);
        }

        return(abObj);
    }
示例#15
0
    private AssetBundleObject LoadAssetBundleSync(string _hashName)
    {
        AssetBundleObject abObj = null;

        if (_loadedABList.ContainsKey(_hashName)) //已经加载
        {
            abObj = _loadedABList[_hashName];
            abObj._refCount++;

            foreach (var dpObj in abObj._depends)
            {
                LoadAssetBundleSync(dpObj._hashName); //递归依赖项,附加引用计数
            }

            return(abObj);
        }
        else if (_loadingABList.ContainsKey(_hashName)) //在加载中,异步改同步
        {
            abObj = _loadingABList[_hashName];
            abObj._refCount++;

            foreach (var dpObj in abObj._depends)
            {
                LoadAssetBundleSync(dpObj._hashName); //递归依赖项,加载完
            }

            DoLoadedCallFun(abObj, false); //强制完成,回调

            return(abObj);
        }
        else if (_readyABList.ContainsKey(_hashName)) //在准备加载中
        {
            abObj = _readyABList[_hashName];
            abObj._refCount++;

            foreach (var dpObj in abObj._depends)
            {
                LoadAssetBundleSync(dpObj._hashName); //递归依赖项,加载完
            }

            string path1 = GetAssetBundlePath(_hashName);
            abObj._ab = AssetBundle.LoadFromFile(path1);

            _readyABList.Remove(abObj._hashName);
            _loadedABList.Add(abObj._hashName, abObj);

            DoLoadedCallFun(abObj, false); //强制完成,回调

            return(abObj);
        }

        //创建一个加载
        abObj           = new AssetBundleObject();
        abObj._hashName = _hashName;

        abObj._refCount = 1;

        string path = GetAssetBundlePath(_hashName);

        abObj._ab = AssetBundle.LoadFromFile(path);

        if (abObj._ab == null)
        {
            try
            {
                //同步下载解决
                //byte[] bytes = AssetsDownloadMgr.I.DownloadSync(GetFileName(abObj._hashName));
                byte[] bytes = new byte[4];
                if (bytes != null && bytes.Length != 0)
                {
                    abObj._ab = AssetBundle.LoadFromMemory(bytes);
                }
            }
            catch (Exception ex)
            {
                Debug.LogError("LoadAssetBundleSync DownloadSync" + ex.Message);
            }
        }

        //加载依赖项
        string[] dependsData = null;
        if (_dependsDataList.ContainsKey(_hashName))
        {
            dependsData = _dependsDataList[_hashName];
        }

        if (dependsData != null && dependsData.Length > 0)
        {
            abObj._dependLoadingCount = 0;

            foreach (var dpAssetName in dependsData)
            {
                var dpObj = LoadAssetBundleSync(dpAssetName);

                abObj._depends.Add(dpObj);
            }
        }

        _loadedABList.Add(abObj._hashName, abObj);

        return(abObj);
    }