/// <summary> /// 异步加载资源 /// </summary> /// <param name="assetName">资源名</param> private static void LoadAssetAsync(LoadAssetInfo loadAssetInfo) { AssetBundle assetBundle = ReferenceBundle.GetAssetBundle(loadAssetInfo.bundleName); string assetInBundleName = BundleAsset.GetAssetInBundleName(loadAssetInfo.assetName); AssetBundleRequest request = assetBundle.LoadAssetAsync(assetInBundleName); loadAssetInfo.request = request; EnterLoading(loadAssetInfo); }
/// <summary> /// 请求的回调 表明已经加载成功 /// </summary> public void CallCreateAssetBundle() { //Debug.Log("LoadBundleInfo CallCreateAssetBundle " + bundleName); foreach (LoadBundleRequestInfo loadBundleRequestInfo in loadBundleRequestInfoList) { AssetBundle assetBundle = ReferenceBundle.GetAssetBundle(bundleName); loadBundleRequestInfo.onCreateAssetBundle(bundleName, assetBundle, loadBundleRequestInfo.requestId); } RemoveAllBundleRequest(); }
/// <summary> /// 异步加载资源 /// </summary> /// <param name="assetName">需要加载的资源路径</param> /// <param name="onLoadAsset">加载成功之后的回调</param> /// <returns>请求Id</returns> public static int LoadAssetAsync(string assetName, OnLoadAsset onLoadAsset) { // 回调不存在不允加载 if (onLoadAsset == null) { GameLogger.LogError("[资源加载错误] 加载函数回调不能为空,加载后也没有引用"); return(0); } // 资源对应bundle名 string abName = BundleAsset.GetBundleName(assetName); if (abName == null) { GameLogger.LogError("[资源加载错误] 找不到资源 ", assetName); return(0); } // 获取请求ID int requestId = ResourceManager.GetRequestId(); LoadAssetInfo loadAssetInfo = GetTempLoadAssetInfo(); loadAssetInfo.requestId = requestId; loadAssetInfo.assetName = assetName; loadAssetInfo.onLoadAsset = onLoadAsset; loadAssetInfo.bundleName = abName; EnterLoadWait(loadAssetInfo); // 1 asset是否已加载 if (ReferenceObject.IsObjectCreate(loadAssetInfo.assetName)) { EnterWaitCall(loadAssetInfo); } // 2 bundle是否已加载 else if (!ReferenceBundle.IsAssetBundleCraete(abName)) { PushPending(loadAssetInfo); } // 3 从bundle加载资源 else { List <LoadAssetInfo> loadingAssetList = GetLoadAssetStateList(LoadAssetStep.Loading); if (loadingAssetList.Count < _frameLoadMaxCount) { LoadAssetAsync(loadAssetInfo); } } _loadAssetInfoList.Add(loadAssetInfo); return(requestId); }
// Update is called once per frame void Update() { // 检测 加载bundle状态 等待加载-->加载(加载依赖bundle和自己)-->完成回调 RequestLoadBundle.Update(); // 检测 加载asset状态 等待加载-->加载依赖bundle-->加载自己-->完成回调 RequestLoadAsset.Update(); // 检测 asset引用 引用计数为零卸载asset ReferenceObject.Update(); // 检测 bundle引用 同上 ReferenceBundle.Update(); }
public void Clear() { if (assetBundle != null) { //Debug.Log("Destory LoadBundleInfo " + bundleName); ReferenceBundle.ReleaseBundle(bundleName); assetBundle = null; } RemoveAllBundleRequest(); bundleName = null; request = null; step = LoadBundleStep.None; }
/// <summary> /// 异步加载bundle /// </summary> /// <param name="bundleName">bundle路径</param> /// <param name="onCreateAssetBundle">加载成功后的回调 取消加载后将回调将失效</param> /// <returns></returns> public static int CreateAssetBundleAsync(int requestId, string bundleName, OnCreateAssetBundle onCreateAssetBundle) { // 回调不存在不允加载 if (onCreateAssetBundle == null) { return(0); } LoadBundleInfo loadBundleInfo = GetLoadBundleInfo(bundleName); if (loadBundleInfo == null) { loadBundleInfo = GetTempLoadBundleInfo(); _loadBundleInfoList.Add(bundleName, loadBundleInfo); loadBundleInfo.bundleName = bundleName; EnterLoadWait(loadBundleInfo); } requestId = loadBundleInfo.CreateBundleRequest(requestId, onCreateAssetBundle); // 未请求 if (loadBundleInfo.step == LoadBundleStep.LoadWait) { // 1 获取依赖列表 List <string> dependencies = BundleDependencies.GetAssetBundleDependencies(bundleName); // 2 递归请求加载 if (dependencies != null && dependencies.Count > 0) { foreach (string tempBundleName in dependencies) { CreateAssetBundleAsync(requestId, tempBundleName, (string tBundleName, AssetBundle tAssetBundle, int tRequestId) => { // 回调返回会增加引用 所以这里直接释放 ReferenceBundle.ReleaseBundle(tBundleName); }); } } // 3 正加载列表 List <LoadBundleInfo> loadingBundleInfoList = GetLoadBundleStateList(LoadBundleStep.Loading); if (loadingBundleInfoList.Count < _frameLoadMaxCount) { LoadAssetBundle(loadBundleInfo); } } return(requestId); }
public void Clear() { if (asset != null) { ReferenceObject.ReleaseObject(assetName); asset = null; } if (assetBundle != null) { ReferenceBundle.ReleaseBundle(bundleName); assetBundle = null; } step = LoadAssetStep.None; bundleName = null; requestId = 0; request = null; assetName = null; onLoadAsset = null; }
public static void DestoryAssetBundle(string bundleName) { ReferenceBundle.ReleaseBundle(bundleName); }