Пример #1
0
        public override void Update()
        {
            // 如果资源文件加载完毕
            if (States == EAssetFileLoaderStates.LoadAssetFileOK || States == EAssetFileLoaderStates.LoadAssetFileFailed)
            {
                UpdateAllProvider();
                return;
            }

            if (States == EAssetFileLoaderStates.None)
            {
                States = EAssetFileLoaderStates.LoadDepends;
            }

            // 1. 加载所有依赖项
            if (States == EAssetFileLoaderStates.LoadDepends)
            {
                string[] dependencies = AssetSystem.BundleServices.GetDirectDependencies(_manifestPath);
                if (dependencies.Length > 0)
                {
                    foreach (string dpManifestPath in dependencies)
                    {
                        string          dpLoadPath = AssetSystem.BundleServices.GetAssetBundleLoadPath(dpManifestPath);
                        AssetFileLoader dpLoader   = AssetSystem.CreateFileLoaderInternal(dpLoadPath, dpManifestPath);
                        _depends.Add(dpLoader);
                    }
                }
                States = EAssetFileLoaderStates.CheckDepends;
            }

            // 2. 检测所有依赖完成状态
            if (States == EAssetFileLoaderStates.CheckDepends)
            {
                foreach (var dpLoader in _depends)
                {
                    if (dpLoader.IsDone() == false)
                    {
                        return;
                    }
                }
                States = EAssetFileLoaderStates.LoadAssetFile;
            }

            // 3. 加载AssetBundle
            if (States == EAssetFileLoaderStates.LoadAssetFile)
            {
#if UNITY_EDITOR
                // 注意:Unity2017.4编辑器模式下,如果AssetBundle文件不存在会导致编辑器崩溃,这里做了预判。
                if (System.IO.File.Exists(LoadPath) == false)
                {
                    LogSystem.Log(ELogType.Warning, $"Not found assetBundle file : {LoadPath}");
                    States = EAssetFileLoaderStates.LoadAssetFileFailed;
                    return;
                }
#endif

                // Load assetBundle file
                _cacheRequest = AssetBundle.LoadFromFileAsync(LoadPath);
                States        = EAssetFileLoaderStates.CheckAssetFile;
            }

            // 4. 检测AssetBundle加载结果
            if (States == EAssetFileLoaderStates.CheckAssetFile)
            {
                if (_cacheRequest.isDone == false)
                {
                    return;
                }
                CacheBundle = _cacheRequest.assetBundle;

                // Check error
                if (CacheBundle == null)
                {
                    LogSystem.Log(ELogType.Warning, $"Failed to load assetBundle file : {LoadPath}");
                    States = EAssetFileLoaderStates.LoadAssetFileFailed;
                }
                else
                {
                    States = EAssetFileLoaderStates.LoadAssetFileOK;
                }
            }
        }