예제 #1
0
        public void AddCallBack(OnLoadAssetBundle onLoadAssetBundlep)
        {
            if (onLoadAssetBundlep == null)
            {
                return;
            }
            if (onLoadAssetBundle == null)
            {
                onLoadAssetBundle = onLoadAssetBundlep;
            }
            else
            {
                Delegate[] invocationList = onLoadAssetBundle.GetInvocationList();

                for (int i = invocationList.Length - 1; i >= 0; i--)
                {
                    System.Delegate curDelegate = invocationList[i];
                    //同一个ab 同一个对象 同一个方法 只能监听一次
                    if (curDelegate.Target == onLoadAssetBundlep.Target && curDelegate.Method == onLoadAssetBundlep.Method)
                    {
                        Debug.LogWarningFormat("Target {0}, Method{1},is already in AssetBundleLoader {2}", onLoadAssetBundlep.Target, onLoadAssetBundlep.Method, name);
                        return;
                    }
                }
                onLoadAssetBundle += onLoadAssetBundlep;
            }
        }
예제 #2
0
 virtual public void CallBack()
 {
     if (onLoadAssetBundle != null)
     {
         onLoadAssetBundle(name, assetBundle);
         onLoadAssetBundle = null;
         assetBundle       = null;
         _referenceount    = 0;
     }
 }
예제 #3
0
        virtual public void Clear()
        {
            if (assetBundle)
            {
                assetBundle.Unload(false);
            }

            onLoadAssetBundle = null;
            assetBundle       = null;
            _referenceCount   = 0;
        }
예제 #4
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);
        }
예제 #5
0
        /// <summary>
        /// Loads the and dependencies.
        /// 加载 AssetBundle 和其依赖的 AssetBundle
        /// </summary>
        /// <param name="abName">Ab name.</param>
        /// <param name="onLoadAssetBundle">On load asset bundle.</param>
        protected void LoadAndDependencies(string abName, OnLoadAssetBundle onLoadAssetBundle)
        {
            int dependenciesCount = 0;

            if (manifest != null)
            {
                string[] dependencies = manifest.GetAllDependencies(abName);
                dependenciesCount = dependencies.Length;
                //for(int i = 0;i < dependenciesCount;i++){
                for (int i = dependenciesCount - 1; i >= 0; i--)
                {
                    LoadOne(dependencies[i], null);
                }
            }

            if (dependenciesCount == 0)
            {
                for (int i = 0; assetBundleManifestArr != null && i < assetBundleManifestArr.Length; i++)
                {
                    string[] dependencies = assetBundleManifestArr[i].GetAllDependencies(abName);
                    //for(int j = 0;j < dependenciesCount;j++){
                    for (int j = dependenciesCount - 1; j >= 0; j--)
                    {
                        LoadOne(dependencies[j], null);
                    }
                    if (dependencies.Length > 0)
                    {
                        LoadOne(abName, onLoadAssetBundle);
                        return;
                    }

                    /*
                     * dependenciesCount = LoadDependencies (abName, assetBundleManifestArr [i], onLoadAssetBundle);
                     * //在附加库中查找依赖
                     * if (dependenciesCount > 0) {
                     *      break;
                     * }*/
                }
            }
            if (manifest != null)
            {
                //dependenciesCount = LoadDependencies (abName, manifest,onLoadAssetBundle);
                LoadOne(abName, onLoadAssetBundle);
            }
            //LoadOne(abName, onLoadAssetBundle);
        }
예제 #6
0
        virtual public void CallBack()
        {
            if (_referenceCount == 0)
            {
                onLoadAssetBundle = null;
                assetBundle.Unload(false);
                assetBundle = null;

                return;
            }

            if (onLoadAssetBundle != null)
            {
                onLoadAssetBundle(name, assetBundle);
                onLoadAssetBundle = null;
                assetBundle       = null;
                _referenceCount   = 0;
            }
        }
예제 #7
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();

            if (loaderCreate == null)
            {
                assetBundleLoader = defaultLoaderCreate(abName);
            }
            else
            {
                assetBundleLoader = loaderCreate(abName);
            }

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

            return(dependencies.Length);
        }
예제 #8
0
 /// <summary>
 /// 加载 AssetBundle 和其依赖的 AssetBundle 外部调用接口
 /// </summary>
 /// <param name="abName">Ab name.</param>
 /// <param name="onLoadAssetBundle">On load asset bundle.</param>
 public void Load(string abName, OnLoadAssetBundle onLoadAssetBundle)
 {
     LoadAndDependencies(abName, onLoadAssetBundle);
 }
예제 #9
0
        /// <summary>
        /// Loads the asset bundle async.
        /// 'assetBundlePath',只需要填相对路径,不用填后缀,如 UI/Panel/MenuPanel,除非ab不是按AssetConfig里面配置的后缀来设置的.
        /// </summary>

        public AssetBundleLoader LoadAssetBundleAsync(string assetBundleRelativePath, OnLoadAssetBundle callback)
        {
            string fullRelativePath    = AssetConfig.GetAssetBundleFullRelativePath(assetBundleRelativePath);
            string assetBundleFullPath = AssetConfig.GetGameAssetFullPath(fullRelativePath);

            LoaderCallback internelHandler = (bool isOk, object resultObject) =>
            {
                if (isOk)
                {
                    callback.Invoke(resultObject as AssetBundle);
                }
                else
                {
                    callback.Invoke(null);
                }
            };

            return(BaseLoader.Load <AssetBundleLoader>(assetBundleFullPath, "", callback: internelHandler));
        }