Esempio n. 1
0
 public void ClearData()
 {
     LoadAssetBundleResultInforDic.Clear();
     m_AllNeedLoadAssetRecord.Clear();
     AssetBundleExitStateEnum = AssetBundleExitState.None;
     LoadedAssetBundle        = null;
 }
Esempio n. 2
0
 public void SetAssetName(string assetName, AssetBundleExitState exitState)
 {
     if (m_IsInitialed)
     {
         Debug.LogError("SetAssetName  Fail,Asset Already Initialed");
         return;
     }
     m_IsInitialed            = true;
     AssetName                = assetName;
     AssetBundleExitStateEnum = exitState;
 }
Esempio n. 3
0
        /// <summary>
        /// 同步加载资源 (这里处理的是最外层的AssetBundle ,当前资源依赖的AssetBundle 处理在LoadDepdenceAssetBundleAsync)
        /// </summary>
        /// <param name="url"></param>
        protected void LoadAssetBundleSync(string url, string assetFileName, AssetBundleExitState assetBundleState, bool isloadScene)
        {
            m_ResourcesUrl = url;
            if (System.IO.Path.GetExtension(m_ResourcesUrl) != ConstDefine.AssetBundleExtensionName)
            {
                m_ResourcesUrl += ConstDefine.AssetBundleExtensionName;  //组合上扩展名
            }
            #region  加载依赖的资源
            string[] dependenceAssets = AssetBundleMgr.Instance.S_AssetBundleManifest.GetAllDependencies(m_ResourcesUrl); //获取所有的依赖文件
            List <NewAssetBundleLoader3> allDependenceAssetLoader = new List <NewAssetBundleLoader3>();                   //所有依赖文件的加载器
            foreach (var item in dependenceAssets)
            {
                bool isLoaderExit = false;
                NewAssetBundleLoader3 subAssetBundleLoader = ResourcesLoaderMgr.GetOrCreateLoaderInstance <NewAssetBundleLoader3>(item, ref isLoaderExit);
                if (isLoaderExit && subAssetBundleLoader.IsCompleted)
                {
                    Debug.LogEditorInfor("LoadAssetBundleASync Exit ," + item);
                    continue;  //已经存在了 则继续
                }
                allDependenceAssetLoader.Add(subAssetBundleLoader);
                LoadDepdenceAssetBundleSync(item, subAssetBundleLoader, assetBundleState);
            } //递归加载资源的依赖项


            for (int dex = 0; dex < allDependenceAssetLoader.Count; ++dex)
            {
                if (allDependenceAssetLoader[dex].IsError)
                {
                    Debug.LogError("[AssetBundleLoader] LoadAssetBundleSync  Fail, 依赖的 AssetBundle 资源不存在 " + allDependenceAssetLoader[dex].m_ResourcesUrl);
                    OnCompleteLoad(false, string.Format("[AssetBundleLoader] LoadAssetBundle Fail,AssetBundle Path= {0}", allDependenceAssetLoader[dex].m_ResourcesUrl), null, true);
                    break;
                }
            } //判断依赖项是否加载完成
            #endregion


            #region   AssetBundle  同步加载
            AssetLoaderResultInfor.LoadedAssetBundle = AssetBundle.LoadFromFile(S_AssetBundleTopPath + m_ResourcesUrl);
            if (AssetLoaderResultInfor.LoadedAssetBundle == null)
            {
                ResultObj = null;
                OnCompleteLoad(true, string.Format("同步加载本地AssetBundle 失败{0}", url), null, true, 1);
                return;
            }
            LoadAndRecordAsset(AssetLoaderResultInfor, assetBundleState, isloadScene);

            OnCompleteLoad(AssetLoaderResultInfor.LoadedAssetBundle == null, string.Format("[AssetBundleLoader] LoadAssetBundleSuccess  {0}", m_ResourcesUrl), null, true);
            #endregion

            Debug.LogInfor("加载AssetBundle  成功");
        }
Esempio n. 4
0
        /// <summary>
        /// (同步加载)加载AssetBundle 资源
        /// </summary>
        /// <param name="url">相对于AseetBundle 资源存放路径的路径 (如果是打包成整个预制体则是整个预制体的路径)</param>
        /// <param name="assetFileName">实际加载AssetBundle 时候的文件名称(考虑到加载整个AssetBundle 中一个资源的情况)</param>
        /// <param name="onCompleteAct">加载完成回调</param>
        ///  <param name="isloadSceneAsset"> 如果加载的是场景 则这里必须填true ,否则false</param>
        /// <returns></returns>
        private static NewAssetBundleLoader3 LoadAssetBundleAssetSync(string url, string assetFileName, AssetBundleExitState assetBundleState, bool isloadSceneAsset)
        {
            if (string.IsNullOrEmpty(url))
            {
                Debug.LogError(string.Format("Url Can't Be Null , TypeLoader={0}", typeof(NewAssetBundleLoader3)));
                return(null);
            }

            if (assetBundleState == AssetBundleExitState.None)
            {
                Debug.LogError("LoadAssetBundleAssetSync Fail,Not AssetBundle Asset" + url + "    assetFileName=" + assetFileName);
                return(null);
            }

            Debug.LogInfor("LoadAssetBundleAsset  url=" + url + "    assetFileName=" + assetFileName);
            bool isLoaderExit = false;
            NewAssetBundleLoader3 assetBundleLoader = ResourcesLoaderMgr.GetOrCreateLoaderInstance <NewAssetBundleLoader3>(url, ref isLoaderExit);

            if (isLoaderExit && assetBundleLoader.IsCompleted)
            {
                assetBundleLoader.LoadassetModel = LoadAssetModel.Sync;

                //*** 判断当前资源是否加载了
                if (string.IsNullOrEmpty(assetFileName) == false && assetBundleLoader.AssetLoaderResultInfor.m_AllNeedLoadAssetRecord.Contains(assetFileName) == false)
                {
                    assetBundleLoader.AssetLoaderResultInfor.m_AllNeedLoadAssetRecord.Add(assetFileName);
                }
                assetBundleLoader.LoadAndRecordAsset(assetBundleLoader.AssetLoaderResultInfor, assetBundleState, isloadSceneAsset); //加载已经加载的AssetBundle 中的资源

                assetBundleLoader.OnCompleteLoad(assetBundleLoader.IsError, assetBundleLoader.Description, null, true);             //如果当前加载器已经完成加载 则手动触发事件
                return(assetBundleLoader);                                                                                          //如果已经存在 且当前加载器还在加载中,则只需要等待加载完成则回调用回调
            }
            if (assetBundleLoader.LoadassetModel == LoadAssetModel.Async)
            {
                assetBundleLoader.ForceBreakLoaderProcess();
            } //结束之前的加载进程

            assetBundleLoader.LoadassetModel = LoadAssetModel.Sync;
            assetBundleLoader.AssetLoaderResultInfor.SetAssetName(url, assetBundleState);
            assetBundleLoader.m_LoadAssetCoroutine = null;
            if (string.IsNullOrEmpty(assetFileName) == false)
            {
                assetBundleLoader.AssetLoaderResultInfor.m_AllNeedLoadAssetRecord.Add(assetFileName);
            }
            assetBundleLoader.LoadAssetBundleSync(url, assetFileName, assetBundleState, isloadSceneAsset);
            return(assetBundleLoader);
        }
Esempio n. 5
0
        /// <summary>
        ///  AssetBundle 加载资源
        /// </summary>
        /// <param name="url">标识当前需要加载的AssetBundel 资源路径</param>
        /// <param name="assetFileName">在这个AssetBundel 中的资源名称</param>
        /// <param name="loadModel"></param>
        /// <param name="assetBundleState">标识是单独的AssetBundle 还是文件夹组成的AssetBundle</param>
        /// <param name="isloadSceneAsset">标识是否是场景资源加载</param>
        /// <returns></returns>
        public static NewAssetBundleLoader3 LoadAssetBundleAsset(string url, string assetFileName, LoadAssetModel loadModel, AssetBundleExitState assetBundleState, bool isloadSceneAsset)
        {
            if (assetBundleState == AssetBundleExitState.None)
            {
                Debug.LogError("LoadAssetBundleAsset Fail,Not AssetBundle Asset url=" + url);
                return(null);
            }
            url           = url.ToLower();
            assetFileName = assetFileName.ToLower();


            switch (loadModel)
            {
            case LoadAssetModel.None:
                Debug.LogError("异常的加载默认  LoadAssetModel.None 是默认的值 ,使用前请正确赋值");
                return(null);

            case LoadAssetModel.Sync:
                return(LoadAssetBundleAssetSync(url, assetFileName, assetBundleState, isloadSceneAsset));

            case LoadAssetModel.Async:
                return(LoadAssetBundleAssetAsync(url, assetFileName, assetBundleState, isloadSceneAsset));

            default:
                Debug.LogError("没有定义的加载类型 " + loadModel);
                return(null);
            }
        }
Esempio n. 6
0
        /// <summary>
        /// 从加载完成的AssetBundel 中加载资源
        /// </summary>
        /// <param name="loadRecordInfor"></param>
        /// <param name="isloadSceneAsset"></param>

        private void LoadAndRecordAsset(AssetBundleLoaderResultInfor loadRecordInfor, AssetBundleExitState assetBundleState, bool isloadSceneAsset)
        {
            if (isloadSceneAsset)
            {
                var asset = loadRecordInfor.LoadedAssetBundle;  //场景资源返回AssetBundle 使用不同的API加载
                foreach (var item in loadRecordInfor.m_AllNeedLoadAssetRecord)
                {
                    if (loadRecordInfor.CheckIfLoadAsset(item))
                    {
                        continue;
                    }
                    AssetLoaderResultInfor.RecordLoadAsset(item, asset);
                }
            }
            else
            {
                if (assetBundleState == AssetBundleExitState.FolderPrefab)
                {
                    if (AssetBundleMgr.Instance.CheckIfNeedRecord(m_ResourcesUrl))
                    {
                        var content = loadRecordInfor.LoadedAssetBundle.GetAllAssetNames();
                        AssetBundleMgr.Instance.RecordFolderAssetBundleContainAsset(m_ResourcesUrl, content);
                    }
                } //记录

                foreach (var item in loadRecordInfor.m_AllNeedLoadAssetRecord)
                {
                    object asset = null;
                    if (assetBundleState == AssetBundleExitState.FolderPrefab)
                    {
                        if (loadRecordInfor.CheckIfLoadAsset(item))
                        {
                            continue;
                        }
                        if (AssetBundleMgr.Instance.CheckIfContainAsset(m_ResourcesUrl, item))
                        {
                            asset = loadRecordInfor.LoadedAssetBundle.LoadAsset(item);  //
                        }
                    }
                    else
                    {
                        asset = loadRecordInfor.LoadedAssetBundle.LoadAsset(item);  //
                    }

                    AssetLoaderResultInfor.RecordLoadAsset(item, asset);
                }
            }//非场景资源需要加载出来
        }
Esempio n. 7
0
        /// <summary>
        /// 异步加载资源 (这里处理的是最外层的AssetBundle ,当前资源依赖的AssetBundle 处理在LoadDepdenceAssetBundleAsync)
        /// </summary>
        /// <param name="url"></param>
        protected IEnumerator LoadAssetBundleASync(string url, string assetFileName, AssetBundleExitState assetBundleState, bool isloadScene)
        {
            m_ResourcesUrl = url;
            if (System.IO.Path.GetExtension(m_ResourcesUrl) != ConstDefine.AssetBundleExtensionName)
            {
                m_ResourcesUrl += ConstDefine.AssetBundleExtensionName;  //组合上扩展名
            }
            #region  加载依赖的资源
            string[] dependenceAssets = AssetBundleMgr.Instance.S_AssetBundleManifest.GetAllDependencies(m_ResourcesUrl); //获取所有的依赖文件
            List <NewAssetBundleLoader3> allDependenceAssetLoader = new List <NewAssetBundleLoader3>();                   //所有依赖文件的加载器
            foreach (var item in dependenceAssets)
            {
                bool isLoaderExit = false;
                NewAssetBundleLoader3 subAssetBundleLoader = ResourcesLoaderMgr.GetOrCreateLoaderInstance <NewAssetBundleLoader3>(item, ref isLoaderExit);
                if (isLoaderExit && subAssetBundleLoader.IsCompleted)
                {
                    Debug.LogEditorInfor("LoadAssetBundleASync Exit ," + item);
                    continue;  //已经存在了 则继续
                }
                allDependenceAssetLoader.Add(subAssetBundleLoader);
                EventCenter.Instance.StartCoroutine(LoadDepdenceAssetBundleAsync(item, subAssetBundleLoader));
            } //递归加载资源的依赖项


            for (int dex = 0; dex < allDependenceAssetLoader.Count; ++dex)
            {
                while (allDependenceAssetLoader[dex].IsCompleted == false)
                {
                    yield return(null);
                }

                if (allDependenceAssetLoader[dex].IsError)
                {
                    Debug.LogError("[AssetBundleLoader] LoadAssetBundleSync  Fail, 依赖的 AssetBundle 资源不存在 " + allDependenceAssetLoader[dex].m_ResourcesUrl);
                    OnCompleteLoad(false, string.Format("[AssetBundleLoader] LoadAssetBundle Fail DepdenceLoader Fail ,AssetBundle Path= {0} DepdenceLoader Path={1}",
                                                        m_ResourcesUrl, allDependenceAssetLoader[dex].m_ResourcesUrl), null, true);
                    yield break;
                }
            } //判断依赖项是否加载完成
            #endregion

            #region AssetBundleCreateRequest 加载
            string fileAbsolutelyPath        = string.Format("{0}{1}", S_AssetBundleTopPath, m_ResourcesUrl); //当先需要下载的资源的绝对路径
            AssetBundleCreateRequest request = AssetBundle.LoadFromFileAsync(fileAbsolutelyPath);
            yield return(request);

            if (request.isDone)
            {
                Debug.Log("LoadDepdenceAssetBundleAsync Success  depdebceAssetBundleLoader.m_ResourcesUrl=" + m_ResourcesUrl);
                AssetLoaderResultInfor.LoadedAssetBundle = request.assetBundle;
                ResultObj = null;
                LoadAndRecordAsset(AssetLoaderResultInfor, assetBundleState, isloadScene);
            }
            else
            {
                AssetLoaderResultInfor.LoadedAssetBundle = null;
                Debug.LogError("LoadDepdenceAssetBundleAsync  FailAA==  " + url);
                Debug.LogError("LoadDepdenceAssetBundleAsync  Failbb==  " + fileAbsolutelyPath);
            }


            OnCompleteLoad(AssetLoaderResultInfor.LoadedAssetBundle == null, string.Format("[AssetBundleLoader] Load DepdenceAssetBundel Success {0}", m_ResourcesUrl), null, true);
            #endregion

            Debug.LogInfor("加载AssetBundle  成功");
            yield break;
        }
Esempio n. 8
0
        /// <summary>
        /// 加载AssetBundle 资源
        /// </summary>
        /// <param name="url">相对于AseetBundle 资源存放路径的路径 (如果是打包成整个预制体则是整个预制体的路径)</param>
        /// <param name="assetFileName">实际加载AssetBundle 时候的文件名称(考虑到加载整个AssetBundle 中一个资源的情况)</param>
        /// <param name="onCompleteAct">加载完成回调</param>
        ///  <param name="isloadSceneAsset"> 如果加载的是场景 则这里必须填true ,否则false</param>
        /// <returns></returns>
        private static NewAssetBundleLoader3 LoadAssetBundleAssetAsync(string url, string assetFileName, AssetBundleExitState assetBundleState, bool isloadSceneAsset)
        {
            if (string.IsNullOrEmpty(url) || string.IsNullOrEmpty(assetFileName))
            {
                Debug.LogError(string.Format("Url Can't Be Null , TypeLoader={0}", typeof(NewAssetBundleLoader3)));
                return(null);
            }

            if (assetBundleState == AssetBundleExitState.None)
            {
                Debug.LogError("LoadAssetBundleAssetSync Fail,Not AssetBundle Asset" + url + "    assetFileName=" + assetFileName);
                return(null);
            }

            Debug.LogInfor("LoadAssetBundleAsset  url=" + url + "    assetFileName=" + assetFileName);
            bool isLoaderExit = false;
            NewAssetBundleLoader3 assetBundleLoader = ResourcesLoaderMgr.GetOrCreateLoaderInstance <NewAssetBundleLoader3>(url, ref isLoaderExit);

            assetBundleLoader.LoadassetModel = LoadAssetModel.Async; //这里貌似没必要(由于异步加载时候同步加载必定完成了)

            if (isLoaderExit)
            {
                if (assetBundleLoader.IsCompleted)
                {
                    assetBundleLoader.LoadAndRecordAsset(assetBundleLoader.AssetLoaderResultInfor, assetBundleState, isloadSceneAsset);
                    assetBundleLoader.OnCompleteLoad(assetBundleLoader.IsError, assetBundleLoader.Description, null, true);  //如果当前加载器已经完成加载 则手动触发事件
                }
                else
                {
                    assetBundleLoader.AssetLoaderResultInfor.m_AllNeedLoadAssetRecord.Add(assetFileName); //记录需要加载这个指定的资源
                }
                return(assetBundleLoader);                                                                //如果已经存在 且当前加载器还在加载中,则只需要等待加载完成则回调用回调
            }
            assetBundleLoader.AssetLoaderResultInfor.SetAssetName(url, assetBundleState);
            assetBundleLoader.AssetLoaderResultInfor.m_AllNeedLoadAssetRecord.Add(assetFileName);  //记录需要加载这个指定的资源
            assetBundleLoader.m_LoadAssetCoroutine = EventCenter.Instance.StartCoroutine(assetBundleLoader.LoadAssetBundleASync(url, assetFileName, assetBundleState, isloadSceneAsset));
            return(assetBundleLoader);
        }