public AssetBundleLoaderLoadRequest(AssetBundleLoader loader)
 {
     this.loader = loader;
 }
예제 #2
0
        AssetBundleLoader LoadBundleAndDepImpl(string bundleName, bool hold)
        {
            AssetBundleLoader abLoader;

            if (loaders.TryGetValue(bundleName, out abLoader))
            {
                return(abLoader);
            }

            string[] deps = manifest.GetDirectDependencies(bundleName);
            foreach (var dep in deps)
            {
                //递归加载Loader
                LoadBundleAndDepImpl(dep, false);
            }

            //创建
            abLoader = new AssetBundleLoader
            {
                bundleName     = bundleName,
                bundleFullPath = ResourceUtils.FullPathForAssetBundleApi(FilePath(bundleName)),
                waitDepCount   = deps.Length,
                hold           = hold,
            };
            bool isAyncCollision = false;

            foreach (var dep in deps)
            {
                AssetBundleLoader deplo;
                if (loaders.TryGetValue(dep, out deplo))
                {
                    if (deplo.IsComplete)
                    {
                        abLoader.DepComplete(deplo.state == AssetBundleLoader.State.Error);
                    }
                    else
                    {
                        Debug.Assert(deplo.state == AssetBundleLoader.State.Loading, "AssetBundleLoader must be loading");
                        Debug.LogError(string.Format("AssetBundleLoader '{0}' is loading aync, CANNOT load sync!", dep));
                        isAyncCollision = true;
                    }
                }
                else
                {
                    isAyncCollision = true;
                }
            }

            //异步冲突导致的错误, 就不要加入管理器. 这样可以确保下次可以正常被加载
            if (isAyncCollision)
            {
                return(null);
            }

            Debug.Assert(!loaders.ContainsKey(bundleName), "AssetBundleLoader exists.");
            loaders[bundleName] = abLoader;

            abLoader.Load();
            Debug.Assert(abLoader.IsComplete, "AssetBundleLoader load sync must complete");
            return(abLoader);
        }