/// <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); }
AssetBundleLoader defaultLoaderCreate(string path) { AssetBundleLoader assetBundleLoader; if (Application.platform == RuntimePlatform.Android) { assetBundleLoader = new AssetBundleWWWLoader(); } else { assetBundleLoader = new AssetBundleLoadFromFileLoader(); } return(assetBundleLoader); }
/// <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); }