Ejemplo n.º 1
0
        /// <summary>
        /// 加载并缓存
        /// 引用计数加 1
        /// </summary>
        /// <param name="name"></param>
        /// <param name="onLoadAssetBundle"></param>
        public void LoadOne(string abName, OnLoadAssetBundle onLoadAssetBundle)
        {
            //1.检测 AssetBundle 缓存
            AssetBundleInstance assetBundleInstance;

            cache.TryGetValue(abName, out assetBundleInstance);
            if (assetBundleInstance != null)
            {
                //当前 引用计数加 1
                assetBundleInstance.Retain();
                Debug.LogFormat("{0} 已缓存...", abName);

                if (onLoadAssetBundle != null)
                {
                    onLoadAssetBundle(abName, assetBundleInstance.assetBundle);
                }
                return;
            }
            //2. 检查 是否在等待队列里
            AssetBundleLoader[] waitings = waiting.ToArray();
            AssetBundleLoader   curWaitingAssetBundleLoader;

            for (int i = 0; i < waitings.Length; i++)
            {
                curWaitingAssetBundleLoader = waitings[i];
                if (curWaitingAssetBundleLoader.name.Equals(abName))
                {
                    //当前 引用计数加 1
                    curWaitingAssetBundleLoader.Retain();
                    curWaitingAssetBundleLoader.AddCallBack(onLoadAssetBundle);
                    Debug.LogFormat("{0} 正在加载等待中...", curWaitingAssetBundleLoader.name);
                    return;
                }
            }
            //3. 同名资源是否正在加载中
            if (curAssetBundleLoader != null && curAssetBundleLoader.name.Equals(abName))
            {
                //System.Delegate[] invocationList = curAssetBundleLoader.onLoadAssetBundle.GetInvocationList();
                //当前 引用计数加 1
                curAssetBundleLoader.Retain();
                curAssetBundleLoader.AddCallBack(onLoadAssetBundle);
                //System.Delegate[] invocationList1 = curAssetBundleLoader.onLoadAssetBundle.GetInvocationList();
                return;
            }
            //4. 创建加载器
            AssetBundleLoader assetBundleLoader = new AssetBundleWWWLoader();

            assetBundleLoader.name = abName;
            assetBundleLoader.onLoadAssetBundle = onLoadAssetBundle;
            assetBundleLoader.Retain();
            //5. 开始加载或加入等待队列
            StartOrWait(assetBundleLoader);
        }
Ejemplo n.º 2
0
        AssetBundleLoader defaultLoaderCreate(string path)
        {
            AssetBundleLoader assetBundleLoader;

            if (Application.platform == RuntimePlatform.Android)
            {
                assetBundleLoader = new AssetBundleWWWLoader();
            }
            else
            {
                assetBundleLoader = new AssetBundleLoadFromFileLoader();
            }

            return(assetBundleLoader);
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Loads the dependencies.
        /// 加载和子依赖
        /// 引用计数加 1
        /// </summary>
        /// <param name="abName">Ab name.</param>
        protected int LoadDependencies(string abName, AssetBundleManifest assetBundleManifest, OnLoadAssetBundle onLoadAssetBundle = null)
        {
            string[] dependencies = assetBundleManifest.GetAllDependencies(abName);
            //加载子依赖

            for (int i = 0; i < dependencies.Length; i++)
            {
                int dependencieLength = LoadDependencies(dependencies[i], assetBundleManifest);
                Debug.LogWarningFormat("assetBundle {0} ,dependencie {1} ,dependencieLength {2} ", abName, dependencies[i], dependencieLength);
            }

            //1. 检测 AssetBundle 缓存
            AssetBundleInstance assetBundleInstance;

            cache.TryGetValue(abName, out assetBundleInstance);
            if (assetBundleInstance != null)
            {
                //当前 引用计数加 1
                assetBundleInstance.Retain();
                Debug.LogFormat("{0} 已缓存...", abName);
                if (onLoadAssetBundle != null)
                {
                    onLoadAssetBundle(assetBundleInstance.name, assetBundleInstance.assetBundle);
                }
                return(dependencies.Length);
            }
            //2. 检查 是否在等待队列里
            AssetBundleLoader[] waitings = waiting.ToArray();
            AssetBundleLoader   curWaitingAssetBundleLoader;

            for (int i = 0; i < waitings.Length; i++)
            {
                curWaitingAssetBundleLoader = waitings[i];
                if (curWaitingAssetBundleLoader.name.Equals(abName))
                {
                    //当前 引用计数加 1
                    curWaitingAssetBundleLoader.Retain();
                    curWaitingAssetBundleLoader.AddCallBack(onLoadAssetBundle);
                    Debug.LogFormat("{0} 正在加载等待中...", curWaitingAssetBundleLoader.name);
                    return(dependencies.Length);
                }
            }
            //3. 检测 同名资源是否正在加载中
            if (curAssetBundleLoader != null && curAssetBundleLoader.name.Equals(abName))
            {
                //当前 引用计数加 1
                curAssetBundleLoader.Retain();
                curAssetBundleLoader.AddCallBack(onLoadAssetBundle);

                Debug.LogFormat("{0} 正在加载中...", curAssetBundleLoader.name);
                return(dependencies.Length);
            }
            //4. 创建加载器
            AssetBundleLoader assetBundleLoader = new AssetBundleWWWLoader();

            assetBundleLoader.name = abName;
            assetBundleLoader.onLoadAssetBundle = onLoadAssetBundle;
            assetBundleLoader.Retain();
            //5. 开始加载或加入等待队列
            StartOrWait(assetBundleLoader);

            return(dependencies.Length);
        }