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; } }
virtual public void CallBack() { if (onLoadAssetBundle != null) { onLoadAssetBundle(name, assetBundle); onLoadAssetBundle = null; assetBundle = null; _referenceount = 0; } }
virtual public void Clear() { if (assetBundle) { assetBundle.Unload(false); } onLoadAssetBundle = null; assetBundle = null; _referenceCount = 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); }
/// <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); }
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; } }
/// <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); }
/// <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); }
/// <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)); }